18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * WPA Supplicant / dbus-based control interface 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2006, Dan Williams <dcbw@redhat.com> and Red Hat, Inc. 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2009-2010, Witold Sowa <witold.sowa@gmail.com> 5807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt * Copyright (c) 2009-2015, Jouni Malinen <j@w1.fi> 68d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * This software may be distributed under the terms of the BSD license. 804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * See README for more details. 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "includes.h" 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common.h" 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/ieee802_11_defs.h" 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "eap_peer/eap_methods.h" 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "eapol_supp/eapol_supp_sm.h" 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "rsn_supp/wpa.h" 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../config.h" 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../wpa_supplicant_i.h" 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../driver_i.h" 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../notify.h" 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../bss.h" 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../scan.h" 2404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include "../autoscan.h" 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_new_helpers.h" 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_new.h" 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_new_handlers.h" 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_dict_helpers.h" 2904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include "dbus_common_i.h" 30661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt#include "drivers/driver.h" 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidtstatic const char * const debug_strings[] = { 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "excessive", "msgdump", "debug", "info", "warning", "error", NULL 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt * wpas_dbus_error_unknown_error - Return a new UnknownError error message 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @arg: Optional string appended to error message 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an UnknownError 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_error_unknown_error(DBusMessage *message, 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *arg) 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_UNKNOWN_ERROR, 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt arg); 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_iface_unknown - Return a new invalid interface error message 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus error message 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid interface error 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic DBusMessage * wpas_dbus_error_iface_unknown(DBusMessage *message) 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return dbus_message_new_error( 636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, WPAS_DBUS_ERROR_IFACE_UNKNOWN, 646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "wpa_supplicant knows nothing about this interface."); 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_network_unknown - Return a new NetworkUnknown error message 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid network error 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic DBusMessage * wpas_dbus_error_network_unknown(DBusMessage *message) 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return dbus_message_new_error( 786c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, WPAS_DBUS_ERROR_NETWORK_UNKNOWN, 796c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "There is no such a network in this interface."); 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_invalid_args - Return a new InvalidArgs error message 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid options error 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_error_invalid_args(DBusMessage *message, 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *arg) 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply; 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 956c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = dbus_message_new_error( 966c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, WPAS_DBUS_ERROR_INVALID_ARGS, 976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Did not receive correct message arguments."); 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (arg != NULL) 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_append_args(reply, DBUS_TYPE_STRING, &arg, 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1067dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt/** 1077dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * wpas_dbus_error_scan_error - Return a new ScanError error message 1087dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 1097dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @error: Optional string to be used as the error message 1107dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * Returns: a dbus error message 1117dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * 1127dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * Convenience function to create and return a scan error 1137dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt */ 1146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidtstatic DBusMessage * wpas_dbus_error_scan_error(DBusMessage *message, 1156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt const char *error) 1167dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt{ 1176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return dbus_message_new_error(message, 1186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt WPAS_DBUS_ERROR_IFACE_SCAN_ERROR, 1196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt error); 1206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt} 1217dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt 1227dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt 1236c0da2bb83f6915d8260912362692d1a742e057bDmitry ShmidtDBusMessage * wpas_dbus_error_no_memory(DBusMessage *message) 1246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt{ 1256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, "dbus: Failed to allocate memory"); 1266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, NULL); 1277dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt} 1287dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt 1297dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt 1306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidtstatic const char * const dont_quote[] = { 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "key_mgmt", "proto", "pairwise", "auth_alg", "group", "eap", 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "opensc_engine_path", "pkcs11_engine_path", "pkcs11_module_path", 133d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt "bssid", "scan_freq", "freq_list", NULL 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic dbus_bool_t should_quote_opt(const char *key) 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i = 0; 1396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dont_quote[i] != NULL) { 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(key, dont_quote[i]) == 0) 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return FALSE; 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt i++; 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return TRUE; 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * get_iface_by_dbus_path - Get a new network interface 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: Pointer to global data from wpa_supplicant_init() 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @path: Pointer to a dbus object path representing an interface 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Pointer to the interface or %NULL if not found 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_supplicant * get_iface_by_dbus_path( 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global, const char *path) 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) { 160cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s->dbus_new_path && 161cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt os_strcmp(wpa_s->dbus_new_path, path) == 0) 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_s; 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * set_network_properties - Set properties of a configured network 1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @ssid: wpa_ssid structure for a configured network 1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @iter: DBus message iterator containing dictionary of network 1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * properties to set. 1741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: On failure, an error describing the failure 1751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request succeeds, FALSE if it failed 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Sets network configuration with parameters given id DBus dictionary 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t set_network_properties(struct wpa_supplicant *wpa_s, 1801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_ssid *ssid, 1811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter *iter, 1821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error) 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_dbus_dict_entry entry = { .type = DBUS_TYPE_STRING }; 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter_dict; 1861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char *value = NULL; 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpa_dbus_dict_open_read(iter, &iter_dict, error)) 1891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (wpa_dbus_dict_has_dict_entry(&iter_dict)) { 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t size = 50; 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 1941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpa_dbus_dict_get_entry(&iter_dict, &entry)) 1961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto error; 1971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt value = NULL; 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (entry.type == DBUS_TYPE_ARRAY && 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.array_type == DBUS_TYPE_BYTE) { 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (entry.array_len <= 0) 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size = entry.array_len * 2 + 1; 2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = wpa_snprintf_hex(value, size, 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (u8 *) entry.bytearray_value, 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.array_len); 2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret <= 0) 2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (entry.type == DBUS_TYPE_STRING) { 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (should_quote_opt(entry.key)) { 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size = os_strlen(entry.str_value); 2174171258d30a612645aa061cede62233b5c58ca2aDmitry Shmidt if (size == 0) 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size += 3; 2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(value, size, "\"%s\"", 2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.str_value); 2276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(size, ret)) 2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_strdup(entry.str_value); 2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (entry.type == DBUS_TYPE_UINT32) { 2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(value, size, "%u", 2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.uint32_value); 2416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(size, ret)) 2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (entry.type == DBUS_TYPE_INT32) { 2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(value, size, "%d", 2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.int32_value); 2506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(size, ret)) 2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else 2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_set(ssid, entry.key, value, 0) < 0) 2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2582f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt if (os_strcmp(entry.key, "bssid") != 0 && 2592f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt os_strcmp(entry.key, "priority") != 0) 2602f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt wpa_sm_pmksa_cache_flush(wpa_s->wpa, ssid); 2612f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt 2622f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt if (wpa_s->current_ssid == ssid || 2632f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt wpa_s->current_ssid == NULL) { 2642f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt /* 2652f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt * Invalidate the EAP session cache if anything in the 2662f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt * current or previously used configuration changes. 2672f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt */ 2682f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt eapol_sm_invalidate_cached_session(wpa_s->eapol); 2692f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt } 2702f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt 2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((os_strcmp(entry.key, "psk") == 0 && 2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value[0] == '"' && ssid->ssid_len) || 27304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt (os_strcmp(entry.key, "ssid") == 0 && ssid->passphrase)) 2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_update_psk(ssid); 2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (os_strcmp(entry.key, "priority") == 0) 2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_update_prio_list(wpa_s->conf); 2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 279623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt value = NULL; 2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 2841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidterror: 2861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(value); 2871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 2881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_INVALID_ARGS, 2891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "invalid message format"); 2901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_property_getter - Get basic type property 2961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Message iter to use when appending arguments 2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property (must be basic type) 2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @val: pointer to place holding property value 2991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: On failure an error describing the failure 3001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request was successful, FALSE if it failed 3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic getter for basic type properties. Type is required to be basic. 3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_property_getter(DBusMessageIter *iter, 3051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const int type, 3061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const void *val, 3071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error) 3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter; 3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_type_is_basic(type)) { 3121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: given type is not basic", __func__); 3141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 3186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_dbus_type_as_string(type), 3196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &variant_iter) || 3206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_append_basic(&variant_iter, type, val) || 3216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) { 3226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3236c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: error constructing reply", __func__); 3246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return FALSE; 3256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt } 3261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_property_setter - Set basic type property 3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property (must be basic type) 3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @val: pointer to place where value being set will be stored 3361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request was successful, FALSE if it failed 3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic setter for basic type properties. Type is required to be basic. 3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_property_setter(DBusMessageIter *iter, 3411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 3421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const int type, void *val) 3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter; 3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_type_is_basic(type)) { 3471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: given type is not basic", __func__); 3491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Look at the new value */ 3531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_message_iter_recurse(iter, &variant_iter); 3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&variant_iter) != type) { 3551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 3561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "wrong property type"); 3571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&variant_iter, val); 3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_array_property_getter - Get array type property 3671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iterator 3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property array elements (must be basic type) 3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @array: pointer to array of elements to put into response message 3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @array_len: length of above array 3711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: a pointer to an error to fill on failure 3721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request succeeded, FALSE if it failed 3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic getter for array type properties. Array elements type is 3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * required to be basic. 3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_array_property_getter(DBusMessageIter *iter, 3781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const int type, 3791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const void *array, 3801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt size_t array_len, 3811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error) 3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter, array_iter; 3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char type_str[] = "a?"; /* ? will be replaced with subtype letter; */ 3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *sub_type_str; 3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t element_size, i; 3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_type_is_basic(type)) { 3891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: given type is not basic", __func__); 3911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sub_type_str = wpa_dbus_type_as_string(type); 3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt type_str[1] = sub_type_str[0]; 3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 3986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt type_str, &variant_iter) || 3996c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY, 4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sub_type_str, &array_iter)) { 4011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 4026c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: failed to construct message", __func__); 4031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt switch (type) { 4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_BYTE: 4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_BOOLEAN: 4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = 1; 4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_INT16: 4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_UINT16: 4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(uint16_t); 4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_INT32: 4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_UINT32: 4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(uint32_t); 4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_INT64: 4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_UINT64: 4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(uint64_t); 4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_DOUBLE: 4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(double); 4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_STRING: 4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_OBJECT_PATH: 4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(char *); 4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 4311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 4326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: unknown element type %d", __func__, type); 4331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < array_len; i++) { 43743cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt if (!dbus_message_iter_append_basic(&array_iter, type, 43843cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt array + i * element_size)) { 43943cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 44043cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt "%s: failed to construct message 2.5", 44143cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt __func__); 44243cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt return FALSE; 44343cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt } 4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!dbus_message_iter_close_container(&variant_iter, &array_iter) || 4476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) { 4481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 4496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: failed to construct message 3", __func__); 4501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 4511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 4521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 4531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 45804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_simple_array_array_property_getter - Get array array type property 45904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iterator 46004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @type: DBus type of property array elements (must be basic type) 46104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @array: pointer to array of elements to put into response message 46204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @array_len: length of above array 46304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: a pointer to an error to fill on failure 46404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE if the request succeeded, FALSE if it failed 46504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 46604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Generic getter for array type properties. Array elements type is 46704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * required to be basic. 46804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 46904949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_simple_array_array_property_getter(DBusMessageIter *iter, 47004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const int type, 47104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpabuf **array, 47204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt size_t array_len, 47304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusError *error) 47404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 47504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessageIter variant_iter, array_iter; 47604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char type_str[] = "aa?"; 47704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char inner_type_str[] = "a?"; 47804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const char *sub_type_str; 47904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt size_t i; 48004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 48104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_type_is_basic(type)) { 48204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 48304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "%s: given type is not basic", __func__); 48404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 48504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 48604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 48704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt sub_type_str = wpa_dbus_type_as_string(type); 48804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt type_str[2] = sub_type_str[0]; 48904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt inner_type_str[1] = sub_type_str[0]; 49004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 49104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 4926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt type_str, &variant_iter) || 4936c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY, 49404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt inner_type_str, &array_iter)) { 49504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 4966c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: failed to construct message", __func__); 49704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 49804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 49904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 500c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt for (i = 0; i < array_len && array[i]; i++) { 50104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_dbus_dict_bin_array_add_element(&array_iter, 50204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpabuf_head(array[i]), 50304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpabuf_len(array[i])); 50404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 50504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 50604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 5076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!dbus_message_iter_close_container(&variant_iter, &array_iter) || 5086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) { 50904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 5106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: failed to close message", __func__); 51104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 51204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 51304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 51404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return TRUE; 51504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 51604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 51704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 51804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_create_interface - Request registration of a network iface 5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure 5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the new interface object, 5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or a dbus error message with more information 5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "CreateInterface" method call. Handles requests 5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to register a network interface that wpa_supplicant 5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * will manage. 5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_create_interface(DBusMessage *message, 5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter_dict; 5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter; 5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_dbus_dict_entry entry; 5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *driver = NULL; 5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *ifname = NULL; 5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *confname = NULL; 5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *bridge_ifname = NULL; 5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpa_dbus_dict_open_read(&iter, &iter_dict, NULL)) 5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (wpa_dbus_dict_has_dict_entry(&iter_dict)) { 5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_get_entry(&iter_dict, &entry)) 5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 5486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_strcmp(entry.key, "Driver") == 0 && 5496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt entry.type == DBUS_TYPE_STRING) { 550623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt os_free(driver); 5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt driver = os_strdup(entry.str_value); 5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (driver == NULL) 554ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt goto oom; 5556c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt } else if (os_strcmp(entry.key, "Ifname") == 0 && 5566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt entry.type == DBUS_TYPE_STRING) { 557623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt os_free(ifname); 5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ifname = os_strdup(entry.str_value); 5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ifname == NULL) 561ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt goto oom; 5626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt } else if (os_strcmp(entry.key, "ConfigFile") == 0 && 5636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt entry.type == DBUS_TYPE_STRING) { 564623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt os_free(confname); 5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt confname = os_strdup(entry.str_value); 5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (confname == NULL) 568ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt goto oom; 5696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt } else if (os_strcmp(entry.key, "BridgeIfname") == 0 && 5706c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt entry.type == DBUS_TYPE_STRING) { 571623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt os_free(bridge_ifname); 5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bridge_ifname = os_strdup(entry.str_value); 5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bridge_ifname == NULL) 575ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt goto oom; 5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ifname == NULL) 5838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; /* Required Ifname argument missing */ 5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Try to get the wpa_supplicant record for this iface, return 5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * an error if we already control it. 5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_get_iface(global, ifname) != NULL) { 5906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = dbus_message_new_error( 5916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, WPAS_DBUS_ERROR_IFACE_EXISTS, 5926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "wpa_supplicant already controls this interface."); 5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_interface iface; 5966c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&iface, 0, sizeof(iface)); 5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.driver = driver; 5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.ifname = ifname; 6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.confname = confname; 6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.bridge_ifname = bridge_ifname; 6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Otherwise, have wpa_supplicant attach to it. */ 603203eadb9eda41a1dde4a583edb4684319e3f399eDmitry Shmidt wpa_s = wpa_supplicant_add_iface(global, &iface, NULL); 604cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s && wpa_s->dbus_new_path) { 6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *path = wpa_s->dbus_new_path; 6066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, 6096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &path, DBUS_TYPE_INVALID); 6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 6118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_unknown_error( 6126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 6136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "wpa_supplicant couldn't grab this interface."); 6148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 6188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(driver); 6198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ifname); 62061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_free(confname); 6218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bridge_ifname); 6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterror: 6258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, NULL); 6268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 627ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidtoom: 628ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt reply = wpas_dbus_error_no_memory(message); 629ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt goto out; 6308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 6348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_interface - Request deregistration of an interface 6358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: wpa_supplicant global data structure 6378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing a UINT32 indicating success (1) or 6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * failure (0), or returns a dbus error message with more information 6398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "removeInterface" method call. Handles requests 6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to deregister a network interface that wpa_supplicant 6428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * currently manages. 6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_interface(DBusMessage *message, 6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *path; 6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &path, 6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s = get_iface_by_dbus_path(global, path); 6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s == NULL) 6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_iface_unknown(message); 657c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt else if (wpa_supplicant_remove_iface(global, wpa_s, 0)) { 6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_unknown_error( 6596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 6606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "wpa_supplicant couldn't remove this interface."); 6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_interface - Get the object path for an interface name 6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure 6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the interface object, 6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or a dbus error message with more information 6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "getInterface" method call. 6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_interface(DBusMessage *message, 6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *ifname; 6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *path; 6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &ifname, 6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s = wpa_supplicant_get_iface(global, ifname); 688cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s == NULL || wpa_s->dbus_new_path == NULL) 6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_error_iface_unknown(message); 6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt path = wpa_s->dbus_new_path; 6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply == NULL) 6946c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpas_dbus_error_no_memory(message); 6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path, 6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID)) { 6978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 6986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpas_dbus_error_no_memory(message); 6998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_level - Get debug level 7071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 7081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 7091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 7101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 7118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugLevel" property. 7138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_level(DBusMessageIter *iter, 7151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 7161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 7178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *str; 7198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int idx = wpa_debug_level; 7201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 7218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (idx < 0) 7228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt idx = 0; 7238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (idx > 5) 7248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt idx = 5; 7258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt str = debug_strings[idx]; 7261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 7271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &str, error); 7288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_timestamp - Get debug timestamp 7331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 7341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 7351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 7361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 7378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugTimestamp" property. 7398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_timestamp(DBusMessageIter *iter, 7416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt DBusError *error, 7426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt void *user_data) 7438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 7451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &wpa_debug_timestamp, error); 7468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_show_keys - Get debug show keys 7521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 7531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 7541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 7551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 7568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugShowKeys" property. 7588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_show_keys(DBusMessageIter *iter, 7601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 7611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 7628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 7641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &wpa_debug_show_keys, error); 7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_level - Set debug level 7701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 7711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 7721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 7731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 7748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugLevel" property. 7768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_level(DBusMessageIter *iter, 7781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 7798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_global *global = user_data; 7818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *str = NULL; 7828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i, val = -1; 7838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING, 7851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &str)) 7861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 7878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; debug_strings[i]; i++) 7898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(debug_strings[i], str) == 0) { 7908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val = i; 7918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 7928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (val < 0 || 7958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_set_debug_params(global, val, wpa_debug_timestamp, 7968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_show_keys)) { 7976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 7986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "wrong debug level value"); 7991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 8008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 8038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 8078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_timestamp - Set debug timestamp 8081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 8091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 8101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 8111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 8128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 8138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugTimestamp" property. 8148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 8151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_timestamp(DBusMessageIter *iter, 8161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 8171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 8188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_global *global = user_data; 8208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t val; 8218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, 8231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &val)) 8241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 8258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_set_debug_params(global, wpa_debug_level, val ? 1 : 0, 8278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_show_keys); 8281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 8298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 8338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_show_keys - Set debug show keys 8341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 8351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 8361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 8371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 8388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 8398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugShowKeys" property. 8408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 8411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_show_keys(DBusMessageIter *iter, 8421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 8431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 8448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_global *global = user_data; 8468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t val; 8478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, 8491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &val)) 8501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 8518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_set_debug_params(global, wpa_debug_level, 8538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_timestamp, 8548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val ? 1 : 0); 8551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 8568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 8608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_interfaces - Request registered interfaces list 8611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 8621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 8631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 8641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 8658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 8668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Interfaces" property. Handles requests 8678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of registered interfaces objects 8688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * paths 8698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 8701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_interfaces(DBusMessageIter *iter, 8711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 8721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 8738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_global *global = user_data; 8758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 8768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char **paths; 8778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int i = 0, num = 0; 8781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success; 8798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 880cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) { 881cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s->dbus_new_path) 882cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt num++; 883cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } 8848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 88561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt paths = os_calloc(num, sizeof(char *)); 8868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!paths) { 8871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 8881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 8898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 891cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) { 892cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s->dbus_new_path) 893cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt paths[i++] = wpa_s->dbus_new_path; 894cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } 8958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, 8971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_OBJECT_PATH, 8981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt paths, num, error); 8998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths); 9011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 9028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 9068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_eap_methods - Request supported EAP methods list 9071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 9081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 9091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 9101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 9118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 9128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "EapMethods" property. Handles requests 9138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of strings with supported EAP methods 9148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 9151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_eap_methods(DBusMessageIter *iter, 9161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 9178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **eap_methods; 9198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t num_items = 0; 9201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success; 9218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eap_methods = eap_get_names_as_string_array(&num_items); 9238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!eap_methods) { 9241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 9251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 9268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, 9291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_STRING, 9301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt eap_methods, 9311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt num_items, error); 9328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (num_items) 9348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(eap_methods[--num_items]); 9358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(eap_methods); 9361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 9378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 940d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt/** 941d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * wpas_dbus_getter_global_capabilities - Request supported global capabilities 942d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @iter: Pointer to incoming dbus message iter 943d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @error: Location to store error on failure 944d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @user_data: Function specific data 945d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Returns: TRUE on success, FALSE on failure 946d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * 947d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Getter for "Capabilities" property. Handles requests by dbus clients to 948d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * return a list of strings with supported capabilities like AP, RSN IBSS, 949d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * and P2P that are determined at compile time. 950d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt */ 951d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtdbus_bool_t wpas_dbus_getter_global_capabilities(DBusMessageIter *iter, 9526c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt DBusError *error, 9536c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt void *user_data) 954d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{ 955d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt const char *capabilities[5] = { NULL, NULL, NULL, NULL, NULL }; 956d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt size_t num_items = 0; 957d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 958d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_AP 959d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities[num_items++] = "ap"; 960d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_AP */ 961d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_IBSS_RSN 962d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities[num_items++] = "ibss-rsn"; 963d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_IBSS_RSN */ 964d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_P2P 965d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities[num_items++] = "p2p"; 966d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_P2P */ 967d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_INTERWORKING 968d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities[num_items++] = "interworking"; 969d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_INTERWORKING */ 970d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 971d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return wpas_dbus_simple_array_property_getter(iter, 972d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt DBUS_TYPE_STRING, 973d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities, 974d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt num_items, error); 975d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt} 976d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 977d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 9788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_type(DBusMessage *message, DBusMessageIter *var, 9798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **type, DBusMessage **reply) 9808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_STRING) { 9826c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s[dbus]: Type must be a string", 9836c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 9848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 9858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong Type value type. String required"); 9868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(var, type); 9898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 9908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ssids(DBusMessage *message, DBusMessageIter *var, 9948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params *params, 9958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage **reply) 9968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_ssid *ssids = params->ssids; 9988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t ssids_num = 0; 9998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *ssid; 10008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter array_iter, sub_array_iter; 10018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *val; 10028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int len; 10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) { 10056c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 10066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: ssids must be an array of arrays of bytes", 10076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 10106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Wrong SSIDs value type. Array of arrays of bytes required"); 10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(var, &array_iter); 10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY || 10176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE) { 10186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 10196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: ssids must be an array of arrays of bytes", 10206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 10236c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Wrong SSIDs value type. Array of arrays of bytes required"); 10248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY) { 10288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssids_num >= WPAS_MAX_SCAN_SSIDS) { 10296c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 10306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: Too many ssids specified on scan dbus call", 10316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 10328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 10346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Too many ssids specified. Specify at most four"); 10358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&array_iter, &sub_array_iter); 10398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len); 10418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10429d9e60286e05ae45025b672636490bd12586138dDmitry Shmidt if (len > SSID_MAX_LEN) { 1043c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt wpa_printf(MSG_DEBUG, 10446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: SSID too long (len=%d max_len=%d)", 10459d9e60286e05ae45025b672636490bd12586138dDmitry Shmidt __func__, len, SSID_MAX_LEN); 1046c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 1047c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt message, "Invalid SSID: too long"); 1048c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return -1; 1049c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt } 1050c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 10518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (len != 0) { 10528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = os_malloc(len); 10538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 10546c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt *reply = wpas_dbus_error_no_memory(message); 10558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(ssid, val, len); 10588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 10598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Allow zero-length SSIDs */ 10608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = NULL; 10618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssids[ssids_num].ssid = ssid; 10648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssids[ssids_num].ssid_len = len; 10658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssids_num++; 10688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->num_ssids = ssids_num; 10718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 10728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ies(DBusMessage *message, DBusMessageIter *var, 10768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params *params, 10778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage **reply) 10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *ies = NULL, *nies; 10808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ies_len = 0; 10818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter array_iter, sub_array_iter; 10828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *val; 10838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int len; 10848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) { 10866c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 10876c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: ies must be an array of arrays of bytes", 10886c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 10898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 10916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Wrong IEs value type. Array of arrays of bytes required"); 10928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(var, &array_iter); 10968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY || 10986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE) { 10996c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 11006c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: ies must be an array of arrays of bytes", 11016c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 11028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong IEs value type. Array required"); 11048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY) { 11088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&array_iter, &sub_array_iter); 11098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len); 11118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (len == 0) { 11128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 11138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 11148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nies = os_realloc(ies, ies_len + len); 11178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nies == NULL) { 11188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ies); 11196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt *reply = wpas_dbus_error_no_memory(message); 11208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ies = nies; 11238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(ies + ies_len, val, len); 11248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ies_len += len; 11258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 11278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->extra_ies = ies; 11308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->extra_ies_len = ies_len; 11318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 11328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 11338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_channels(DBusMessage *message, 11368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter *var, 11378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params *params, 11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage **reply) 11398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 11408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter array_iter, sub_array_iter; 11418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int *freqs = NULL, *nfreqs; 11428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int freqs_num = 0; 11438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) { 11456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 11466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: Channels must be an array of structs", 11476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 11488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 11506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Wrong Channels value type. Array of structs required"); 11518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(var, &array_iter); 11558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_STRUCT) { 11578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, 11586c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: Channels must be an array of structs", 11596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 11608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 11626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Wrong Channels value type. Array of structs required"); 11638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_STRUCT) 11678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 11688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int freq, width; 11698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&array_iter, &sub_array_iter); 11718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&sub_array_iter) != 11738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_UINT32) { 11746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 11756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: Channel must by specified by struct of two UINT32s %c", 11766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__, 11778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_arg_type( 11788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &sub_array_iter)); 11798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11806c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 11816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Wrong Channel struct. Two UINT32s required"); 11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 11838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&sub_array_iter, &freq); 11868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_next(&sub_array_iter) || 11888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_arg_type(&sub_array_iter) != 11898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_UINT32) { 11906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 11916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: Channel must by specified by struct of two UINT32s", 11926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 11938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, 11958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Wrong Channel struct. Two UINT32s required"); 11968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 11978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&sub_array_iter, &width); 12018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define FREQS_ALLOC_CHUNK 32 12038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (freqs_num % FREQS_ALLOC_CHUNK == 0) { 120461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt nfreqs = os_realloc_array( 120561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt freqs, freqs_num + FREQS_ALLOC_CHUNK, 120661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt sizeof(int)); 12078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nfreqs == NULL) 12088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 12098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs = nfreqs; 12108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (freqs == NULL) { 12126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt *reply = wpas_dbus_error_no_memory(message); 12138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs[freqs_num] = freq; 12178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs_num++; 12198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 12208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 122261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt nfreqs = os_realloc_array(freqs, freqs_num + 1, sizeof(int)); 12238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nfreqs == NULL) 12248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 12258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs = nfreqs; 12268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (freqs == NULL) { 12276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt *reply = wpas_dbus_error_no_memory(message); 12288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs[freqs_num] = 0; 12318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->freqs = freqs; 12338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 12348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 12358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1237051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidtstatic int wpas_dbus_get_scan_allow_roam(DBusMessage *message, 1238051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt DBusMessageIter *var, 1239051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt dbus_bool_t *allow, 1240051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt DBusMessage **reply) 1241051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt{ 1242051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_BOOLEAN) { 12436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s[dbus]: Type must be a boolean", 12446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 1245051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 1246051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt message, "Wrong Type value type. Boolean required"); 1247051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt return -1; 1248051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt } 1249051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt dbus_message_iter_get_basic(var, allow); 1250051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt return 0; 1251051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt} 1252051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 1253051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 12548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 12558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_scan - Request a wireless scan on an interface 12568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 12578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 12588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL indicating success or DBus error message on failure 12598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 12608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Scan" method call of a network device. Requests 12618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * that wpa_supplicant perform a wireless scan as soon as possible 12628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * on a particular wireless interface. 12638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 12648d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_scan(DBusMessage *message, 12658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 12668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 12678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 12688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, dict_iter, entry_iter, variant_iter; 12698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *key = NULL, *type = NULL; 12708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params params; 12718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t i; 1272051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt dbus_bool_t allow_roam = 1; 12738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(¶ms, 0, sizeof(params)); 12758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 12778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&iter, &dict_iter); 12798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dbus_message_iter_get_arg_type(&dict_iter) == 12816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt DBUS_TYPE_DICT_ENTRY) { 12828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&dict_iter, &entry_iter); 12838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&entry_iter, &key); 12848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&entry_iter); 12858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&entry_iter, &variant_iter); 12868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(key, "Type") == 0) { 12888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_type(message, &variant_iter, 12898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &type, &reply) < 0) 12908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 12918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(key, "SSIDs") == 0) { 12928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_ssids(message, &variant_iter, 12938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ¶ms, &reply) < 0) 12948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 12958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(key, "IEs") == 0) { 12968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_ies(message, &variant_iter, 12978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ¶ms, &reply) < 0) 12988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 12998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(key, "Channels") == 0) { 13008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_channels(message, &variant_iter, 13018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ¶ms, &reply) < 0) 13028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 1303051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt } else if (os_strcmp(key, "AllowRoam") == 0) { 1304051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt if (wpas_dbus_get_scan_allow_roam(message, 1305051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt &variant_iter, 1306051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt &allow_roam, 1307051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt &reply) < 0) 1308051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt goto out; 13098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 13106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s[dbus]: Unknown argument %s", 13116c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__, key); 13128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, key); 13138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&dict_iter); 13178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!type) { 13206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s[dbus]: Scan type not specified", 13216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 13228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, key); 13238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_strcmp(type, "passive") == 0) { 13278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (params.num_ssids || params.extra_ies_len) { 13286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 13296c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: SSIDs or IEs specified for passive scan.", 13306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 13318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args( 13326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 13336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "You can specify only Channels in passive scan"); 13348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 1336cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s->sched_scanning) { 1337cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt wpa_printf(MSG_DEBUG, 1338cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt "%s[dbus]: Stop ongoing sched_scan to allow requested scan to proceed", 1339cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt __func__); 1340cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt wpa_supplicant_cancel_sched_scan(wpa_s); 1341cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } 1342cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt 1343cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (params.freqs && params.freqs[0]) { 1344cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_supplicant_trigger_scan(wpa_s, 1345cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt ¶ms)) { 1346cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt reply = wpas_dbus_error_scan_error( 1347cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt message, 1348cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt "Scan request rejected"); 1349cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } 1350cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } else { 1351cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt wpa_s->scan_req = MANUAL_SCAN_REQ; 1352cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt wpa_supplicant_req_scan(wpa_s, 0, 0); 1353cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } 13548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13556c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt } else if (os_strcmp(type, "active") == 0) { 13568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!params.num_ssids) { 13578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Add wildcard ssid */ 13588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.num_ssids++; 13598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 136004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN 136104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt autoscan_deinit(wpa_s); 136204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */ 1363cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s->sched_scanning) { 1364cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt wpa_printf(MSG_DEBUG, 1365cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt "%s[dbus]: Stop ongoing sched_scan to allow requested scan to proceed", 1366cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt __func__); 1367cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt wpa_supplicant_cancel_sched_scan(wpa_s); 1368cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } 1369cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt 13707dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt if (wpa_supplicant_trigger_scan(wpa_s, ¶ms)) { 13717dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt reply = wpas_dbus_error_scan_error( 13727dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt message, "Scan request rejected"); 13737dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt } 13748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 13756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s[dbus]: Unknown scan type: %s", 13766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__, type); 13778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, 13788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Wrong scan type"); 13798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1382051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt if (!allow_roam) 1383051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt wpa_s->scan_res_handler = scan_only_handler; 1384051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 13858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 13868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < WPAS_MAX_SCAN_SSIDS; i++) 13878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free((u8 *) params.ssids[i].ssid); 13888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free((u8 *) params.extra_ies); 13898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(params.freqs); 13908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 13918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 13928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1394661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt/** 1395661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * wpas_dbus_handler_signal_poll - Request immediate signal properties 1396661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @message: Pointer to incoming dbus message 1397661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 1398661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Returns: NULL indicating success or DBus error message on failure 1399661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * 1400661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Handler function for "SignalPoll" method call of a network device. Requests 1401661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * that wpa_supplicant read signal properties like RSSI, noise, and link 1402661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * speed and return them. 1403661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt */ 1404661b4f78e48c697429dc46154a4125892c001718Dmitry ShmidtDBusMessage * wpas_dbus_handler_signal_poll(DBusMessage *message, 1405661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt struct wpa_supplicant *wpa_s) 1406661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt{ 1407661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt struct wpa_signal_info si; 1408661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt DBusMessage *reply = NULL; 1409661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt DBusMessageIter iter, iter_dict, variant_iter; 1410661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt int ret; 1411661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1412661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt ret = wpa_drv_signal_poll(wpa_s, &si); 1413661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (ret) { 1414661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_FAILED, 1415661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt "Failed to read signal"); 1416661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt } 1417661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1418661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt reply = dbus_message_new_method_return(message); 1419661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (reply == NULL) 1420661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt goto nomem; 1421661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1422661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt dbus_message_iter_init_append(reply, &iter); 1423661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1424661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT, 14256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "a{sv}", &variant_iter) || 14266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_open_write(&variant_iter, &iter_dict) || 14276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_append_int32(&iter_dict, "rssi", 14286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt si.current_signal) || 14296c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_append_int32(&iter_dict, "linkspeed", 14306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt si.current_txrate / 1000) || 14316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_append_int32(&iter_dict, "noise", 14326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt si.current_noise) || 14336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_append_uint32(&iter_dict, "frequency", 14346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt si.frequency) || 14356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (si.chanwidth != CHAN_WIDTH_UNKNOWN && 14366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_append_string( 14376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_dict, "width", 14386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt channel_width_to_string(si.chanwidth))) || 14396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (si.center_frq1 > 0 && si.center_frq2 > 0 && 14406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (!wpa_dbus_dict_append_int32(&iter_dict, "center-frq1", 14416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt si.center_frq1) || 14426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_append_int32(&iter_dict, "center-frq2", 14436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt si.center_frq2))) || 14446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (si.avg_signal && 14456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_append_int32(&iter_dict, "avg-rssi", 14466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt si.avg_signal)) || 14476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_close_write(&variant_iter, &iter_dict) || 14486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(&iter, &variant_iter)) 1449661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt goto nomem; 1450661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1451661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt return reply; 1452661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1453661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidtnomem: 1454661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (reply) 1455661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt dbus_message_unref(reply); 14566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpas_dbus_error_no_memory(message); 1457661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt} 1458661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1459661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 14608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 14618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_disconnect - Terminate the current connection 14628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 14638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 14648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NotConnected DBus error message if already not connected 14658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or NULL otherwise. 14668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 14678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Disconnect" method call of network interface. 14688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 14698d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_disconnect(DBusMessage *message, 14708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 14718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 14728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->current_ssid != NULL) { 14738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->disconnected = 1; 14748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_deauthenticate(wpa_s, 14758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WLAN_REASON_DEAUTH_LEAVING); 14768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 14788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_NOT_CONNECTED, 14818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "This interface is not connected"); 14828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 14838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 14868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_add_network - Add a new configured network 14878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 14888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 14898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing the object path of the new network 14908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 14918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "AddNetwork" method call of a network interface. 14928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 14938d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_network(DBusMessage *message, 14948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 14958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 14968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 14978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter; 14988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid = NULL; 14998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *path = path_buf; 15001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError error; 15018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 15038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1504cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s->dbus_new_path) 1505cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt ssid = wpa_config_add_network(wpa_s->conf); 15068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 15076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_ERROR, "%s[dbus]: can't add new interface.", 15086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 15098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_unknown_error( 15108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, 15116c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "wpa_supplicant could not add a network on this interface."); 15128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 15138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_added(wpa_s, ssid); 15158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid->disabled = 1; 15168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_set_network_defaults(ssid); 15178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_error_init(&error); 15191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!set_network_properties(wpa_s, ssid, &iter, &error)) { 15206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 15216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: control interface couldn't set network properties", 15226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 15231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_reply_new_from_error(message, &error, 15241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_ERROR_INVALID_ARGS, 15251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "Failed to add network"); 15261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_error_free(&error); 15278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 15288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Construct the object path for this network. */ 15318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX, 15328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d", 15338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, ssid->id); 15348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 15368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply == NULL) { 15376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = wpas_dbus_error_no_memory(message); 15388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 15398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path, 15418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID)) { 15428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 15436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = wpas_dbus_error_no_memory(message); 15448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 15458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 15488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr: 15508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid) { 15518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_removed(wpa_s, ssid); 15528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_remove_network(wpa_s->conf, ssid->id); 15538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 15558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 15568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1559413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt * wpas_dbus_handler_reassociate - Reassociate 156061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * @message: Pointer to incoming dbus message 156161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 1562413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt * Returns: InterfaceDisabled DBus error message if disabled 156361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * or NULL otherwise. 156461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * 156561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * Handler function for "Reassociate" method call of network interface. 156661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt */ 156761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtDBusMessage * wpas_dbus_handler_reassociate(DBusMessage *message, 156861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt struct wpa_supplicant *wpa_s) 156961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 1570413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt if (wpa_s->wpa_state != WPA_INTERFACE_DISABLED) { 1571d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt wpas_request_connection(wpa_s); 157261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return NULL; 157361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 157461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 1575413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_IFACE_DISABLED, 1576413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt "This interface is disabled"); 157761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 157861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 157961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 158061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt/** 15819866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * wpas_dbus_handler_reattach - Reattach to current AP 15829866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * @message: Pointer to incoming dbus message 15839866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 15849866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * Returns: NotConnected DBus error message if not connected 15859866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * or NULL otherwise. 15869866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * 15879866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * Handler function for "Reattach" method call of network interface. 15889866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt */ 15899866086a955d00e237cc8df3722e7dff75c02532Dmitry ShmidtDBusMessage * wpas_dbus_handler_reattach(DBusMessage *message, 15909866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt struct wpa_supplicant *wpa_s) 15919866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt{ 15929866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt if (wpa_s->current_ssid != NULL) { 15939866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt wpa_s->reattach = 1; 15949866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt wpas_request_connection(wpa_s); 15959866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt return NULL; 15969866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt } 15979866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt 15989866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_NOT_CONNECTED, 15999866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt "This interface is not connected"); 16009866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt} 16019866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt 16029866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt 16039866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt/** 1604a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt * wpas_dbus_handler_reconnect - Reconnect if disconnected 1605a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt * @message: Pointer to incoming dbus message 1606a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 1607a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt * Returns: InterfaceDisabled DBus error message if disabled 1608a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt * or NULL otherwise. 1609a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt * 1610a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt * Handler function for "Reconnect" method call of network interface. 1611a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt */ 1612a3dc30964aa24aea2b518246f6812663a1103490Dmitry ShmidtDBusMessage * wpas_dbus_handler_reconnect(DBusMessage *message, 1613a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt struct wpa_supplicant *wpa_s) 1614a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt{ 1615a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) { 1616a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt return dbus_message_new_error(message, 1617a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt WPAS_DBUS_ERROR_IFACE_DISABLED, 1618a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt "This interface is disabled"); 1619a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt } 1620a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt 1621a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt if (wpa_s->disconnected) 1622a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt wpas_request_connection(wpa_s); 1623a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt return NULL; 1624a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt} 1625a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt 1626a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt 1627a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt/** 16288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_network - Remove a configured network 16298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 16308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 16318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure 16328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 16338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveNetwork" method call of a network interface. 16348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 16358d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_network(DBusMessage *message, 16368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 16378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 16388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 16398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *op; 16406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt char *iface, *net_id; 16418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int id; 16428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 16432f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt int was_disabled; 16448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op, 16468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 16478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Extract the network ID and ensure the network */ 16498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* is actually a child of this interface */ 16506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt iface = wpas_dbus_new_decompose_object_path(op, 16516c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt WPAS_DBUS_NEW_NETWORKS_PART, 16526c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &net_id); 1653cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (iface == NULL || net_id == NULL || !wpa_s->dbus_new_path || 1654d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt os_strcmp(iface, wpa_s->dbus_new_path) != 0) { 16558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 16568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 16578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1659d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt errno = 0; 16608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt id = strtoul(net_id, NULL, 10); 1661d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (errno != 0) { 16628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 16638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 16648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 16678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 16688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_network_unknown(message); 16698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 16708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16722f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt was_disabled = ssid->disabled; 16732f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 16748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_removed(wpa_s, ssid); 16758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == wpa_s->current_ssid) 16778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_deauthenticate(wpa_s, 16788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WLAN_REASON_DEAUTH_LEAVING); 16792f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt else if (!was_disabled && wpa_s->sched_scanning) { 16806c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 16816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Stop ongoing sched_scan to remove network from filters"); 16822f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt wpa_supplicant_cancel_sched_scan(wpa_s); 16832f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt wpa_supplicant_req_scan(wpa_s, 0, 0); 16842f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt } 16852f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 1686684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt if (wpa_config_remove_network(wpa_s->conf, id) < 0) { 1687684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt wpa_printf(MSG_ERROR, 16886c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: error occurred when removing network %d", 16896c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__, id); 1690684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt reply = wpas_dbus_error_unknown_error( 16916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 16926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "error removing the specified network on is interface."); 1693684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt goto out; 1694684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt } 16958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 16978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(iface); 16988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 16998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void remove_network(void *arg, struct wpa_ssid *ssid) 17038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = arg; 17058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_removed(wpa_s, ssid); 17078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_remove_network(wpa_s->conf, ssid->id) < 0) { 17098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, 17106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: error occurred when removing network %d", 17116c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__, ssid->id); 17128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 17138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == wpa_s->current_ssid) 1716d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt wpa_supplicant_deauthenticate(wpa_s, 1717d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt WLAN_REASON_DEAUTH_LEAVING); 17188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 17228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_all_networks - Remove all configured networks 17238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 17248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 17258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure 17268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 17278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveAllNetworks" method call of a network interface. 17288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 17298d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_all_networks( 17308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *message, struct wpa_supplicant *wpa_s) 17318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17322f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt if (wpa_s->sched_scanning) 17332f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt wpa_supplicant_cancel_sched_scan(wpa_s); 17342f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 17358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* NB: could check for failure and return an error */ 17368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_foreach_network(wpa_s->conf, remove_network, wpa_s); 17378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 17388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 17428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_select_network - Attempt association with a network 17438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 17448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 17458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure 17468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 17478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "SelectNetwork" method call of network interface. 17488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 17498d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_select_network(DBusMessage *message, 17508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 17518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 17538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *op; 17546c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt char *iface, *net_id; 17558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int id; 17568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 17578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op, 17598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 17608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Extract the network ID and ensure the network */ 17628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* is actually a child of this interface */ 17636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt iface = wpas_dbus_new_decompose_object_path(op, 17646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt WPAS_DBUS_NEW_NETWORKS_PART, 17656c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &net_id); 1766cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (iface == NULL || net_id == NULL || !wpa_s->dbus_new_path || 1767d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt os_strcmp(iface, wpa_s->dbus_new_path) != 0) { 17688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 17698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 17708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1772d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt errno = 0; 17738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt id = strtoul(net_id, NULL, 10); 1774d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (errno != 0) { 17758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 17768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 17778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 17808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 17818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_network_unknown(message); 17828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 17838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Finally, associate with the network */ 17868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_select_network(wpa_s, ssid); 17878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 17898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(iface); 17908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 17918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 17951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * wpas_dbus_handler_network_reply - Reply to a NetworkRequest signal 17961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @message: Pointer to incoming dbus message 17971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 17981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: NULL on success or dbus error on failure 17991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * 18001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Handler function for "NetworkReply" method call of network interface. 18011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt */ 18021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry ShmidtDBusMessage * wpas_dbus_handler_network_reply(DBusMessage *message, 18031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s) 18041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 18051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef IEEE8021X_EAPOL 18061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessage *reply = NULL; 18071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const char *op, *field, *value; 18086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt char *iface, *net_id; 18091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int id; 18101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_ssid *ssid; 18111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 18121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_get_args(message, NULL, 18136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt DBUS_TYPE_OBJECT_PATH, &op, 18146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt DBUS_TYPE_STRING, &field, 18156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt DBUS_TYPE_STRING, &value, 18166c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt DBUS_TYPE_INVALID)) 18171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_error_invalid_args(message, NULL); 18181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 18191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Extract the network ID and ensure the network */ 18201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* is actually a child of this interface */ 18216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt iface = wpas_dbus_new_decompose_object_path(op, 18226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt WPAS_DBUS_NEW_NETWORKS_PART, 18236c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &net_id); 1824cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (iface == NULL || net_id == NULL || !wpa_s->dbus_new_path || 1825d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt os_strcmp(iface, wpa_s->dbus_new_path) != 0) { 18261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 18271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto out; 18281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 18291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1830d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt errno = 0; 18311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt id = strtoul(net_id, NULL, 10); 1832d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (errno != 0) { 18331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_error_invalid_args(message, net_id); 18341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto out; 18351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 18361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 18371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 18381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (ssid == NULL) { 18391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_error_network_unknown(message); 18401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto out; 18411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 18421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 18431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (wpa_supplicant_ctrl_iface_ctrl_rsp_handle(wpa_s, ssid, 18441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt field, value) < 0) 18451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_error_invalid_args(message, field); 18461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt else { 18471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Tell EAP to retry immediately */ 18481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt eapol_sm_notify_ctrl_response(wpa_s->eapol); 18491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 18501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 18511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtout: 18521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(iface); 18531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return reply; 18541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#else /* IEEE8021X_EAPOL */ 18551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: 802.1X not included"); 18561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_error_unknown_error(message, "802.1X not included"); 18571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* IEEE8021X_EAPOL */ 18581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 18591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 18601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1861700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_BLOBS 1862700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt 18631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/** 18648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_add_blob - Store named binary blob (ie, for certificates) 18658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 18668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 18678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing an error on failure or NULL on success 18688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 18698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally store a binary blobs. 18708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 18718d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_blob(DBusMessage *message, 18728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 18738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 18758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, array_iter; 18768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *blob_name; 18788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *blob_data; 18798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int blob_len; 18808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_config_blob *blob = NULL; 18818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 18838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&iter, &blob_name); 18848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_get_blob(wpa_s->conf, blob_name)) { 18868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, 18878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPAS_DBUS_ERROR_BLOB_EXISTS, 18888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 18898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&iter); 18928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&iter, &array_iter); 18938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_fixed_array(&array_iter, &blob_data, &blob_len); 18958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = os_zalloc(sizeof(*blob)); 18978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!blob) { 18986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = wpas_dbus_error_no_memory(message); 18998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 19008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->data = os_malloc(blob_len); 19036c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt blob->name = os_strdup(blob_name); 19046c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!blob->data || !blob->name) { 19056c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = wpas_dbus_error_no_memory(message); 19068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 19078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(blob->data, blob_data, blob_len); 19098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->len = blob_len; 19108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_set_blob(wpa_s->conf, blob); 19128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_blob_added(wpa_s, blob->name); 19138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 19158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr: 19178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (blob) { 19188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(blob->name); 19198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(blob->data); 19208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(blob); 19218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 19238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 19248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 19278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_blob - Get named binary blob (ie, for certificates) 19288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 19298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 19308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing array of bytes (blob) 19318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 19328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Gets one wpa_supplicant's binary blobs. 19338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 19348d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_blob(DBusMessage *message, 19358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 19368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 19378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 19388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, array_iter; 19398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *blob_name; 19418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct wpa_config_blob *blob; 19428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name, 19448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 19458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = wpa_config_get_blob(wpa_s->conf, blob_name); 19478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!blob) { 19488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, 19498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPAS_DBUS_ERROR_BLOB_UNKNOWN, 19508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Blob id not set"); 19518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 19546c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!reply) 19556c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpas_dbus_error_no_memory(message); 19568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init_append(reply, &iter); 19588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, 19608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_BYTE_AS_STRING, 19616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &array_iter) || 19626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_append_fixed_array(&array_iter, DBUS_TYPE_BYTE, 19636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &(blob->data), blob->len) || 19646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(&iter, &array_iter)) { 19658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 19666c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = wpas_dbus_error_no_memory(message); 19678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 19708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 19718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 19748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_remove_handler_remove_blob - Remove named binary blob 19758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 19768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 19778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error 19788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 19798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally remove a binary blobs. 19808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 19818d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_blob(DBusMessage *message, 19828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 19838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 19848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 19858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *blob_name; 19868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name, 19888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 19898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_remove_blob(wpa_s->conf, blob_name)) { 19918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, 19928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPAS_DBUS_ERROR_BLOB_UNKNOWN, 19938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Blob id not set"); 19948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_blob_removed(wpa_s, blob_name); 19968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 19988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 20008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2001700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_BLOBS */ 2002700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt 2003700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt 20048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 20058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_flush_bss - Flush the BSS cache 20068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 20078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 20088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL 20098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 20108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "FlushBSS" method call of network interface. 20118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 20128d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_flush_bss(DBusMessage *message, 20138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 20148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 20158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t age; 20168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_UINT32, &age, 20188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 20198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (age == 0) 20218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_bss_flush(wpa_s); 20228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 20238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_bss_flush_by_age(wpa_s, age); 20248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 20268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 20278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 202904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN 203004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 203104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_handler_autoscan - Set autoscan parameters for the interface 203204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @message: Pointer to incoming dbus message 203304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 203404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: NULL 203504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 203604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Handler function for "AutoScan" method call of network interface. 203704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 203804949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_autoscan(DBusMessage *message, 203904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_supplicant *wpa_s) 204004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 204104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessage *reply = NULL; 204204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt enum wpa_states state = wpa_s->wpa_state; 204304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *arg; 204404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 204504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &arg, 204604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBUS_TYPE_INVALID); 204704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 204804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (arg != NULL && os_strlen(arg) > 0) { 204904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *tmp; 20506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 205104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt tmp = os_strdup(arg); 205204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (tmp == NULL) { 20536c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = wpas_dbus_error_no_memory(message); 205404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else { 205504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(wpa_s->conf->autoscan); 205604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->conf->autoscan = tmp; 205704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (state == WPA_DISCONNECTED || state == WPA_INACTIVE) 205804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt autoscan_init(wpa_s, 1); 205904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt else if (state == WPA_SCANNING) 206004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_supplicant_reinit_autoscan(wpa_s); 206104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 206204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (arg != NULL && os_strlen(arg) == 0) { 206304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(wpa_s->conf->autoscan); 206404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->conf->autoscan = NULL; 206504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt autoscan_deinit(wpa_s); 206604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else 206704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt reply = dbus_message_new_error(message, 206804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBUS_ERROR_INVALID_ARGS, 206904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt NULL); 207004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 207104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return reply; 207204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 207304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */ 207404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 207504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 20768da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt/* 20778da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * wpas_dbus_handler_eap_logoff - IEEE 802.1X EAPOL state machine logoff 20788da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @message: Pointer to incoming dbus message 20798da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 20808da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Returns: NULL 20818da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * 20828da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Handler function for "EAPLogoff" method call of network interface. 20838da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt */ 20848da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry ShmidtDBusMessage * wpas_dbus_handler_eap_logoff(DBusMessage *message, 20858da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt struct wpa_supplicant *wpa_s) 20868da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt{ 20878da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt eapol_sm_notify_logoff(wpa_s->eapol, TRUE); 20888da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt return NULL; 20898da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt} 20908da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt 20918da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt 20928da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt/* 20938da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * wpas_dbus_handler_eap_logon - IEEE 802.1X EAPOL state machine logon 20948da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @message: Pointer to incoming dbus message 20958da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 20968da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Returns: NULL 20978da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * 20988da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Handler function for "EAPLogin" method call of network interface. 20998da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt */ 21008da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry ShmidtDBusMessage * wpas_dbus_handler_eap_logon(DBusMessage *message, 21018da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt struct wpa_supplicant *wpa_s) 21028da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt{ 21038da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt eapol_sm_notify_logoff(wpa_s->eapol, FALSE); 21048da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt return NULL; 21058da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt} 21068da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt 21078da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt 2108e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt#ifdef CONFIG_TDLS 2109e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 21107d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidtstatic int get_peer_hwaddr_helper(DBusMessage *message, const char *func_name, 21117d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt u8 *peer_address, DBusMessage **error) 2112e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 2113e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt const char *peer_string; 2114e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 21157d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt *error = NULL; 21167d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt 2117e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (!dbus_message_get_args(message, NULL, 2118e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt DBUS_TYPE_STRING, &peer_string, 21197d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt DBUS_TYPE_INVALID)) { 21207d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt *error = wpas_dbus_error_invalid_args(message, NULL); 21217d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt return -1; 21227d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt } 2123e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2124e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (hwaddr_aton(peer_string, peer_address)) { 2125e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: invalid address '%s'", 2126e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt func_name, peer_string); 21277d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt *error = wpas_dbus_error_invalid_args( 2128e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt message, "Invalid hardware address format"); 21297d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt return -1; 2130e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt } 2131e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 21327d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt return 0; 2133e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 2134e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2135e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2136e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/* 2137e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_discover - Discover TDLS peer 2138e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message 2139e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 2140e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure 2141e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * 2142e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSDiscover" method call of network interface. 2143e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */ 2144e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_discover(DBusMessage *message, 2145e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt struct wpa_supplicant *wpa_s) 2146e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 2147e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt u8 peer[ETH_ALEN]; 2148e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt DBusMessage *error_reply; 2149e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt int ret; 2150e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 21517d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0) 2152e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return error_reply; 2153e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2154e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_printf(MSG_DEBUG, "DBUS TDLS_DISCOVER " MACSTR, MAC2STR(peer)); 2155e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2156e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (wpa_tdls_is_external_setup(wpa_s->wpa)) 2157e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_tdls_send_discovery_request(wpa_s->wpa, peer); 2158e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt else 2159e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_drv_tdls_oper(wpa_s, TDLS_DISCOVERY_REQ, peer); 2160e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2161e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (ret) { 2162e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return wpas_dbus_error_unknown_error( 2163e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt message, "error performing TDLS discovery"); 2164e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt } 2165e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2166e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return NULL; 2167e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 2168e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2169e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2170e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/* 2171e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_setup - Setup TDLS session 2172e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message 2173e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 2174e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure 2175e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * 2176e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSSetup" method call of network interface. 2177e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */ 2178e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_setup(DBusMessage *message, 2179e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt struct wpa_supplicant *wpa_s) 2180e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 2181e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt u8 peer[ETH_ALEN]; 2182e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt DBusMessage *error_reply; 2183e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt int ret; 2184e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 21857d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0) 2186e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return error_reply; 2187e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2188e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_printf(MSG_DEBUG, "DBUS TDLS_SETUP " MACSTR, MAC2STR(peer)); 2189e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2190e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_tdls_remove(wpa_s->wpa, peer); 2191e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (wpa_tdls_is_external_setup(wpa_s->wpa)) 2192e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_tdls_start(wpa_s->wpa, peer); 2193e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt else 2194e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_drv_tdls_oper(wpa_s, TDLS_SETUP, peer); 2195e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2196e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (ret) { 2197e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return wpas_dbus_error_unknown_error( 2198e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt message, "error performing TDLS setup"); 2199e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt } 2200e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2201e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return NULL; 2202e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 2203e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2204e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2205e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/* 2206e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_status - Return TDLS session status 2207e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message 2208e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 2209e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: A string representing the state of the link to this TDLS peer 2210e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * 2211e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSStatus" method call of network interface. 2212e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */ 2213e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_status(DBusMessage *message, 2214e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt struct wpa_supplicant *wpa_s) 2215e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 2216e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt u8 peer[ETH_ALEN]; 2217e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt DBusMessage *reply; 2218e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt const char *tdls_status; 2219e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 22207d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt if (get_peer_hwaddr_helper(message, __func__, peer, &reply) < 0) 2221e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return reply; 2222e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2223e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_printf(MSG_DEBUG, "DBUS TDLS_STATUS " MACSTR, MAC2STR(peer)); 2224e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2225e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt tdls_status = wpa_tdls_get_link_status(wpa_s->wpa, peer); 2226e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2227e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt reply = dbus_message_new_method_return(message); 2228e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt dbus_message_append_args(reply, DBUS_TYPE_STRING, 2229e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt &tdls_status, DBUS_TYPE_INVALID); 2230e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return reply; 2231e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 2232e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2233e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2234e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/* 2235e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_teardown - Teardown TDLS session 2236e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message 2237e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 2238e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure 2239e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * 2240e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSTeardown" method call of network interface. 2241e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */ 2242e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_teardown(DBusMessage *message, 2243e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt struct wpa_supplicant *wpa_s) 2244e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 2245e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt u8 peer[ETH_ALEN]; 2246e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt DBusMessage *error_reply; 2247e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt int ret; 2248e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 22497d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0) 2250e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return error_reply; 2251e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2252e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_printf(MSG_DEBUG, "DBUS TDLS_TEARDOWN " MACSTR, MAC2STR(peer)); 2253e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2254e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (wpa_tdls_is_external_setup(wpa_s->wpa)) 2255e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_tdls_teardown_link( 2256e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_s->wpa, peer, 2257e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED); 2258e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt else 2259e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_drv_tdls_oper(wpa_s, TDLS_TEARDOWN, peer); 2260e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2261e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (ret) { 2262e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return wpas_dbus_error_unknown_error( 2263e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt message, "error performing TDLS teardown"); 2264e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt } 2265e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2266e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return NULL; 2267e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 2268e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2269e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt#endif /* CONFIG_TDLS */ 2270e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2271e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 22728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 227301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_handler_set_pkcs11_engine_and_module_path - Set PKCS #11 engine and module path 227401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @message: Pointer to incoming dbus message 227501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 227601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing an error on failure or NULL on success 227701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * 227801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Sets the PKCS #11 engine and module path. 227901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */ 228001904cfafd75a70b9f29c0220b90bdef45595491Dmitry ShmidtDBusMessage * wpas_dbus_handler_set_pkcs11_engine_and_module_path( 228101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt DBusMessage *message, struct wpa_supplicant *wpa_s) 228201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{ 228301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt DBusMessageIter iter; 228401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt char *value = NULL; 228501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt char *pkcs11_engine_path = NULL; 228601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt char *pkcs11_module_path = NULL; 228701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 228801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt dbus_message_iter_init(message, &iter); 228901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt dbus_message_iter_get_basic(&iter, &value); 229001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (value == NULL) { 229101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return dbus_message_new_error( 229201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt message, DBUS_ERROR_INVALID_ARGS, 229301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt "Invalid pkcs11_engine_path argument"); 229401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt } 229501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt /* Empty path defaults to NULL */ 229601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (os_strlen(value)) 229701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_engine_path = value; 229801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 229901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt dbus_message_iter_next(&iter); 230001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt dbus_message_iter_get_basic(&iter, &value); 230101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (value == NULL) { 230201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt os_free(pkcs11_engine_path); 230301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return dbus_message_new_error( 230401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt message, DBUS_ERROR_INVALID_ARGS, 230501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt "Invalid pkcs11_module_path argument"); 230601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt } 230701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt /* Empty path defaults to NULL */ 230801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (os_strlen(value)) 230901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_module_path = value; 231001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 231101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (wpas_set_pkcs11_engine_and_module_path(wpa_s, pkcs11_engine_path, 231201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_module_path)) 231301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return dbus_message_new_error( 231401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt message, DBUS_ERROR_FAILED, 23156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Reinit of the EAPOL state machine with the new PKCS #11 engine and module path failed."); 231601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 2317cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s->dbus_new_path) { 2318cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt wpa_dbus_mark_property_changed( 2319cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt wpa_s->global->dbus, wpa_s->dbus_new_path, 2320cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11EnginePath"); 2321cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt wpa_dbus_mark_property_changed( 2322cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt wpa_s->global->dbus, wpa_s->dbus_new_path, 2323cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11ModulePath"); 2324cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } 232501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 232601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return NULL; 232701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt} 232801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 232901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 233001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/** 23318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_capabilities - Return interface capabilities 23321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 23331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 23341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 23351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 23368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 23378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Capabilities" property of an interface. 23388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 23391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_capabilities(DBusMessageIter *iter, 23401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 23418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 23421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 23438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_capa capa; 23448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 23451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter iter_dict, iter_dict_entry, iter_dict_val, iter_array, 23468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt variant_iter; 23478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *scans[] = { "active", "passive", "ssid" }; 23488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 23506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "a{sv}", &variant_iter) || 23516c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_open_write(&variant_iter, &iter_dict)) 23528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 23538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = wpa_drv_get_capa(wpa_s, &capa); 23558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** pairwise cipher */ 23578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 23588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = {"ccmp", "tkip", "none"}; 23596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 23608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 23618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "Pairwise", args, 236268d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(args))) 23638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 23648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 23658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Pairwise", 23668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 23678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 23686c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array) || 23696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP_256) && 23706c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "ccmp-256")) || 23726c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP_256) && 23736c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "gcmp-256")) || 23756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) && 23766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "ccmp")) || 23786c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP) && 23796c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23806c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "gcmp")) || 23816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) && 23826c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23836c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "tkip")) || 23846c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) && 23856c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23866c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "none")) || 23876c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_end_string_array(&iter_dict, 23888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 23898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 23908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 23918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 23928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 23938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** group cipher */ 23958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 23968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { 23978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "ccmp", "tkip", "wep104", "wep40" 23988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }; 23996c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 24008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 24018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "Group", args, 240268d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(args))) 24038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 24058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Group", 24068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 24078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 24086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array) || 24096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP_256) && 24106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24116c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "ccmp-256")) || 24126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP_256) && 24136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "gcmp-256")) || 24156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) && 24166c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "ccmp")) || 24186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP) && 24196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "gcmp")) || 24216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) && 24226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24236c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "tkip")) || 24246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_WEP104) && 24256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "wep104")) || 24276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_WEP40) && 24286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24296c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "wep40")) || 24306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_end_string_array(&iter_dict, 24318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 24328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 24338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 24348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** key management */ 24388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 24398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { 24408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa-psk", "wpa-eap", "ieee8021x", "wpa-none", 24418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 24428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wps", 24438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 24448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "none" 24458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }; 24468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 24478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "KeyMgmt", args, 244868d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(args))) 24498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 24518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "KeyMgmt", 24528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 24538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 24546c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array) || 24556c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element(&iter_array, 24566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "none") || 24576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element(&iter_array, 24588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "ieee8021x")) 24598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA | 24628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2)) { 24638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 24646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "wpa-eap") || 24656c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_FT) && 24666c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24676c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "wpa-ft-eap"))) 24688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */ 24718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 24728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 24738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-eap-sha256")) 24748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 24768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK | 24798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) { 24808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 24816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "wpa-psk") || 24826c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.key_mgmt & 24836c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_FT_PSK) && 24846c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24856c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "wpa-ft-psk"))) 24868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */ 24898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 24908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 24918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-psk-sha256")) 24928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 24948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24966c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if ((capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) && 24976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element(&iter_array, 24986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "wpa-none")) 24996c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt goto nomem; 25008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 25038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element(&iter_array, 25048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wps")) 25058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 25078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_end_string_array(&iter_dict, 25098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 25108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 25118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 25128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** WPA protocol */ 25168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 25178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { "rsn", "wpa" }; 25186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 25198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 25208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "Protocol", args, 252168d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(args))) 25228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 25248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Protocol", 25258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 25268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 25276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array) || 25286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA2 | 25296c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) && 25306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 25316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "rsn")) || 25326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA | 25336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK)) && 25346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 25356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "wpa")) || 25366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_end_string_array(&iter_dict, 25378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 25388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 25398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 25408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** auth alg */ 25448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 25458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { "open", "shared", "leap" }; 25466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 25478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 25488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "AuthAlg", args, 254968d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(args))) 25508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 25528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "AuthAlg", 25538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 25548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 25558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 25568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25586c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (((capa.auth & WPA_DRIVER_AUTH_OPEN) && 25596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 25606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "open")) || 25616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.auth & WPA_DRIVER_AUTH_SHARED) && 25626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 25636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "shared")) || 25646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.auth & WPA_DRIVER_AUTH_LEAP) && 25656c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 25666c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "leap")) || 25676c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_end_string_array(&iter_dict, 25688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 25698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 25708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 25718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** Scan */ 25758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array(&iter_dict, "Scan", scans, 257668d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(scans))) 25778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** Modes */ 258075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Modes", 258175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_entry, 258275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_val, 25836c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array) || 25846c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 25856c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "infrastructure") || 25866c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 25876c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "ad-hoc") || 25886c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (res >= 0 && (capa.flags & WPA_DRIVER_FLAGS_AP) && 25896c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 25906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "ap")) || 25916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (res >= 0 && (capa.flags & WPA_DRIVER_FLAGS_P2P_CAPABLE) && 25926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 25936c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "p2p")) || 25946c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_end_string_array(&iter_dict, 259575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_entry, 259675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_val, 259775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_array)) 259875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen goto nomem; 259975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen /***** Modes end */ 260075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen 26011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (res >= 0) { 26021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_int32_t max_scan_ssid = capa.max_scan_ssids; 26031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 26041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpa_dbus_dict_append_int32(&iter_dict, "MaxScanSSID", 26051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt max_scan_ssid)) 26061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto nomem; 26071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 26081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 26096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict) || 26106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) 26118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 26128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 26148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem: 26161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 26171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 26188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 26198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 26228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_state - Get interface state 26231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 26241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 26251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 26261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 26278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 26288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "State" property. 26298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 26301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_state(DBusMessageIter *iter, DBusError *error, 26311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 26328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 26331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 26348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *str_state; 26358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *state_ls, *tmp; 26361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 26378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt str_state = wpa_supplicant_state_txt(wpa_s->wpa_state); 26398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* make state string lowercase to fit new DBus API convention 26418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 26428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt state_ls = tmp = os_strdup(str_state); 26438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!tmp) { 26441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 26451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 26468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*tmp) { 26488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *tmp = tolower(*tmp); 26498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tmp++; 26508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 26531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &state_ls, error); 26548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(state_ls); 26568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 26588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 26598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 26628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_get_scanning - Get interface scanning state 26631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 26641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 26651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 26661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 26678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 26688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "scanning" property. 26698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 26701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_scanning(DBusMessageIter *iter, DBusError *error, 26716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt void *user_data) 26728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 26731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 26748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t scanning = wpa_s->scanning ? TRUE : FALSE; 26751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 26761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 26771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &scanning, error); 26788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 26798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 26828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ap_scan - Control roaming mode 26831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 26841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 26851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 26861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 26878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 26888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "ApScan" property. 26898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 26901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_ap_scan(DBusMessageIter *iter, DBusError *error, 26911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 26928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 26931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 26948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t ap_scan = wpa_s->conf->ap_scan; 26951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 26961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, 26971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &ap_scan, error); 26988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 26998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 27028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_ap_scan - Control roaming mode 27031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 27041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 27051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 27061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 27078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 27088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "ApScan" property. 27098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 27101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_ap_scan(DBusMessageIter *iter, DBusError *error, 27111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 27128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 27131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 27148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t ap_scan; 27158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32, 27171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &ap_scan)) 27181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 27198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_set_ap_scan(wpa_s, ap_scan)) { 27211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 27221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "ap_scan must be 0, 1, or 2"); 27231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 27248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 27251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 27268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 2730c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * wpas_dbus_getter_fast_reauth - Control fast 2731c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * reauthentication (TLS session resumption) 2732c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 2733c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @error: Location to store error on failure 2734c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @user_data: Function specific data 2735c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Returns: TRUE on success, FALSE on failure 2736c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * 2737c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Getter function for "FastReauth" property. 2738c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt */ 2739c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidtdbus_bool_t wpas_dbus_getter_fast_reauth(DBusMessageIter *iter, 2740c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt DBusError *error, 2741c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt void *user_data) 2742c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt{ 2743c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 2744c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt dbus_bool_t fast_reauth = wpa_s->conf->fast_reauth ? TRUE : FALSE; 2745c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2746c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 2747c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt &fast_reauth, error); 2748c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt} 2749c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2750c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2751c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt/** 2752c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * wpas_dbus_setter_fast_reauth - Control fast 2753c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * reauthentication (TLS session resumption) 2754c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 2755c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @error: Location to store error on failure 2756c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @user_data: Function specific data 2757c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Returns: TRUE on success, FALSE on failure 2758c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * 2759c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Setter function for "FastReauth" property. 2760c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt */ 2761c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidtdbus_bool_t wpas_dbus_setter_fast_reauth(DBusMessageIter *iter, 2762c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt DBusError *error, 2763c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt void *user_data) 2764c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt{ 2765c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 2766c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt dbus_bool_t fast_reauth; 2767c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2768c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, 2769c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt &fast_reauth)) 2770c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return FALSE; 2771c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2772c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt wpa_s->conf->fast_reauth = fast_reauth; 2773c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return TRUE; 2774c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt} 2775c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2776c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2777c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt/** 277804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_getter_disconnect_reason - Get most recent reason for disconnect 277904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 278004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure 278104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data 278204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 278304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 278404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Getter for "DisconnectReason" property. The reason is negative if it is 278504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * locally generated. 278604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 278704949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_getter_disconnect_reason(DBusMessageIter *iter, 278804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusError *error, 278904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt void *user_data) 279004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 279104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 279204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_int32_t reason = wpa_s->disconnect_reason; 27936c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 279404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32, 279504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt &reason, error); 279604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 279704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 279804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 279904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 28008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_age - Get BSS entry expiration age 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 "BSSExpireAge" property. 28078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 28081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_expire_age(DBusMessageIter *iter, 28091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 28101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 28118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 28121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 28138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t expire_age = wpa_s->conf->bss_expiration_age; 28141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 28151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, 28161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &expire_age, error); 28178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 28188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 28218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_age - Control BSS entry expiration age 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 "BSSExpireAge" property. 28288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 28291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_bss_expire_age(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_age; 28358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32, 28371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &expire_age)) 28381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 28398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_set_bss_expiration_age(wpa_s, expire_age)) { 28411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 28421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "BSSExpireAge must be >= 10"); 28431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 28448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 28451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 28468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 28478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 28508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_count - Get BSS entry expiration scan count 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 "BSSExpireCount" property. 28578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 28581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_expire_count(DBusMessageIter *iter, 28591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 28601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 28618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 28621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 286361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt dbus_uint32_t expire_count = wpa_s->conf->bss_expiration_scan_count; 28641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 28651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, 28661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &expire_count, error); 28678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 28688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 28718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_count - Control BSS entry expiration scan count 28721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 28731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 28741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 28751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 28768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 28778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "BSSExpireCount" property. 28788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 28791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_bss_expire_count(DBusMessageIter *iter, 28801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 28811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 28828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 28831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 28848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t expire_count; 28858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32, 28871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &expire_count)) 28881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 28898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_set_bss_expiration_count(wpa_s, expire_count)) { 28911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 28921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "BSSExpireCount must be > 0"); 28931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 28948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 28951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 28968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 28978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 29008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_country - Control country code 29011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 29021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 29031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 29041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 29058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 29068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "Country" property. 29078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 29081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_country(DBusMessageIter *iter, DBusError *error, 29091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 29108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 29111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 29128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char country[3]; 29138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *str = country; 29148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt country[0] = wpa_s->conf->country[0]; 29168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt country[1] = wpa_s->conf->country[1]; 29178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt country[2] = '\0'; 29188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 29201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &str, error); 29218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 29228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 29258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_country - Control country code 29261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 29271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 29281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 29291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 29308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 29318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "Country" property. 29328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 29331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_country(DBusMessageIter *iter, DBusError *error, 29341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 29358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 29361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 29378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *country; 29388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING, 29401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &country)) 29411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 29428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!country[0] || !country[1]) { 29441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 29451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "invalid country code"); 29461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 29471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 29488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->drv_priv != NULL && wpa_drv_set_country(wpa_s, country)) { 29508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "Failed to set country"); 29511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 29521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "failed to set country code"); 29531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 29548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 29558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->conf->country[0] = country[0]; 29578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->conf->country[1] = country[1]; 29581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 29598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 29608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 296304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_getter_scan_interval - Get scan interval 296404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 296504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure 296604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data 296704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 296804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 296904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Getter function for "ScanInterval" property. 297004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 297104949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_getter_scan_interval(DBusMessageIter *iter, 297204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusError *error, 297304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt void *user_data) 297404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 297504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 297604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_int32_t scan_interval = wpa_s->scan_interval; 297704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 297804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32, 297904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt &scan_interval, error); 298004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 298104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 298204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 298304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 298404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_setter_scan_interval - Control scan interval 298504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 298604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure 298704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data 298804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 298904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 299004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Setter function for "ScanInterval" property. 299104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 299204949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_setter_scan_interval(DBusMessageIter *iter, 299304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusError *error, 299404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt void *user_data) 299504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 299604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 299704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_int32_t scan_interval; 299804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 299904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_INT32, 300004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt &scan_interval)) 300104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 300204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 300304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_supplicant_set_scan_interval(wpa_s, scan_interval)) { 300404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 300504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "scan_interval must be >= 0"); 300604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 300704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 300804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return TRUE; 300904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 301004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 301104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 301204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 30138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ifname - Get interface name 30141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 30151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 30161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 30171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 30188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 30198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Ifname" property. 30208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 30211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_ifname(DBusMessageIter *iter, DBusError *error, 30221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 30238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 30258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *ifname = wpa_s->ifname; 30261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 30271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 30281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &ifname, error); 30298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 30338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_driver - Get interface name 30341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 30351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 30361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 30371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 30388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 30398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Driver" property. 30408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 30411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_driver(DBusMessageIter *iter, DBusError *error, 30421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 30438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 30458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *driver; 30468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->driver == NULL || wpa_s->driver->name == NULL) { 30486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s[dbus]: wpa_s has no driver set", 30496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 30501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, "%s: no driver set", 30511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt __func__); 30521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 30538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 30548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt driver = wpa_s->driver->name; 30561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 30571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &driver, error); 30588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 30628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_bss - Get current bss object path 30631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 30641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 30651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 30661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 30678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 30688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentBSS" property. 30698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 30701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_bss(DBusMessageIter *iter, 30711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 30721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 30738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 30758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *bss_obj_path = path_buf; 30768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3077cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s->current_bss && wpa_s->dbus_new_path) 30788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, 30798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u", 30808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, wpa_s->current_bss->id); 30818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 30828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/"); 30838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_OBJECT_PATH, 30851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &bss_obj_path, error); 30868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 30908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_network - Get current network object path 30911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 30921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 30931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 30941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 30958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 30968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentNetwork" property. 30978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 30981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_network(DBusMessageIter *iter, 30991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 31001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 31018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 31038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *net_obj_path = path_buf; 31048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3105cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s->current_ssid && wpa_s->dbus_new_path) 31068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, 31078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u", 31088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, wpa_s->current_ssid->id); 31098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 31108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/"); 31118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_OBJECT_PATH, 31131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &net_obj_path, error); 31148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 31188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_auth_mode - Get current authentication type 31191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 31201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 31211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 31221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 31238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 31248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentAuthMode" property. 31258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 31261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_auth_mode(DBusMessageIter *iter, 31271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 31281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 31298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 31318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *eap_mode; 31328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *auth_mode; 31338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char eap_mode_buf[WPAS_DBUS_AUTH_MODE_MAX]; 31348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->wpa_state != WPA_COMPLETED) { 31368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt auth_mode = "INACTIVE"; 31378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X || 31388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) { 31398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eap_mode = wpa_supplicant_get_eap_mode(wpa_s); 31408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(eap_mode_buf, WPAS_DBUS_AUTH_MODE_MAX, 31418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "EAP-%s", eap_mode); 31428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt auth_mode = eap_mode_buf; 31438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 31458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt auth_mode = wpa_key_mgmt_txt(wpa_s->key_mgmt, 31468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->current_ssid->proto); 31478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 31488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 31501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &auth_mode, error); 31518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 31558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bridge_ifname - Get interface name 31561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 31571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 31581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 31591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 31608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 31618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BridgeIfname" property. 31628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 31631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bridge_ifname(DBusMessageIter *iter, 31641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 31651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 31668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 31681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const char *bridge_ifname = wpa_s->bridge_ifname; 31696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 31701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 31711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &bridge_ifname, error); 31728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 31768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bsss - Get array of BSSs objects 31771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 31781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 31791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 31801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 31818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 31828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSs" property. 31838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 31841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bsss(DBusMessageIter *iter, DBusError *error, 31851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 31868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 31888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_bss *bss; 31898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **paths; 31908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int i = 0; 31911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 31928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3193cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (!wpa_s->dbus_new_path) { 3194cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3195cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt "%s: no D-Bus interface", __func__); 3196cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt return FALSE; 3197cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } 3198cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt 319961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt paths = os_calloc(wpa_s->num_bss, sizeof(char *)); 32008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!paths) { 32011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 32021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 32038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 32048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Loop through scan results and append each result's object path */ 32068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dl_list_for_each(bss, &wpa_s->bss_id, struct wpa_bss, list_id) { 32078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX); 32088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (paths[i] == NULL) { 32091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, 32101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "no memory"); 32118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 32128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 32138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Construct the object path for this BSS. */ 32148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX, 32158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u", 32168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, bss->id); 32178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 32188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, 32201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_OBJECT_PATH, 32211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt paths, wpa_s->num_bss, 32221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 32238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 32258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (i) 32268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths[--i]); 32278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths); 32281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 32298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 32308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 32338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_networks - Get array of networks objects 32341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 32351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 32361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 32371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 32388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 32398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Networks" property. 32408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 32411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_networks(DBusMessageIter *iter, DBusError *error, 32421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 32438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 32441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 32458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 32468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **paths; 32478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int i = 0, num = 0; 32481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 32498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3250cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (!wpa_s->dbus_new_path) { 3251cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3252cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt "%s: no D-Bus interface", __func__); 3253cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt return FALSE; 3254cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } 3255cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt 32568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) 325775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!network_is_persistent_group(ssid)) 325875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen num++; 32598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 326061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt paths = os_calloc(num, sizeof(char *)); 32618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!paths) { 32621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_NO_MEMORY, "no memory"); 32631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 32648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 32658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Loop through configured networks and append object path of each */ 32678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) { 326875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (network_is_persistent_group(ssid)) 326975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen continue; 32708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX); 32718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (paths[i] == NULL) { 32726c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt dbus_set_error(error, DBUS_ERROR_NO_MEMORY, 32736c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "no memory"); 32748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 32758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 32768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Construct the object path for this network. */ 32788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX, 32798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d", 32808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, ssid->id); 32818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 32828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, 32841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_OBJECT_PATH, 32851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt paths, num, error); 32868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 32888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (i) 32898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths[--i]); 32908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths); 32911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 32928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 32938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 329601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_getter_pkcs11_engine_path - Get PKCS #11 engine path 329701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 329801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @error: Location to store error on failure 329901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @user_data: Function specific data 330001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing the PKCS #11 engine path 330101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * 330201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Getter for "PKCS11EnginePath" property. 330301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */ 330401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidtdbus_bool_t wpas_dbus_getter_pkcs11_engine_path(DBusMessageIter *iter, 330501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt DBusError *error, 330601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt void *user_data) 330701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{ 330801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 330901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt const char *pkcs11_engine_path; 331001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 331101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (wpa_s->conf->pkcs11_engine_path == NULL) 331201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_engine_path = ""; 331301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt else 331401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_engine_path = wpa_s->conf->pkcs11_engine_path; 331501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 331601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt &pkcs11_engine_path, error); 331701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt} 331801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 331901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 332001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/** 332101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_getter_pkcs11_module_path - Get PKCS #11 module path 332201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 332301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @error: Location to store error on failure 332401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @user_data: Function specific data 332501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing the PKCS #11 module path 332601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * 332701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Getter for "PKCS11ModulePath" property. 332801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */ 332901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidtdbus_bool_t wpas_dbus_getter_pkcs11_module_path(DBusMessageIter *iter, 333001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt DBusError *error, 333101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt void *user_data) 333201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{ 333301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 333401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt const char *pkcs11_module_path; 333501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 333601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (wpa_s->conf->pkcs11_module_path == NULL) 333701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_module_path = ""; 333801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt else 333901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_module_path = wpa_s->conf->pkcs11_module_path; 334001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 334101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt &pkcs11_module_path, error); 334201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt} 334301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 334401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 334501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/** 33468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_blobs - Get all blobs defined for this interface 33471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 33481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 33491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 33501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 33518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 33528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Blobs" property. 33538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 33541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_blobs(DBusMessageIter *iter, DBusError *error, 33551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 33568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 33571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 33581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter, dict_iter, entry_iter, array_iter; 33598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_config_blob *blob; 33608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 33628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "a{say}", &variant_iter) || 33638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY, 33648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "{say}", &dict_iter)) { 33651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 33661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 33678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = wpa_s->conf->blobs; 33708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (blob) { 33718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_open_container(&dict_iter, 33728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_DICT_ENTRY, 33738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL, &entry_iter) || 33748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_append_basic(&entry_iter, 33758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_STRING, 33768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &(blob->name)) || 33778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_open_container(&entry_iter, 33788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_ARRAY, 33798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_BYTE_AS_STRING, 33808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &array_iter) || 33818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_append_fixed_array(&array_iter, 33828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_BYTE, 33838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &(blob->data), 33848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->len) || 33858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_close_container(&entry_iter, 33868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &array_iter) || 33878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_close_container(&dict_iter, 33888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &entry_iter)) { 33891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, 33901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "no memory"); 33911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 33928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = blob->next; 33958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_close_container(&variant_iter, &dict_iter) || 33981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) { 33991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 34001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 34018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 34028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 34041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 34051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 34061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 34071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic struct wpa_bss * get_bss_helper(struct bss_handler_args *args, 34081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, const char *func_name) 34091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 34101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res = wpa_bss_get_id(args->wpa_s, args->id); 34111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 34121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) { 34131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_ERROR, "%s[dbus]: no bss with id %d found", 34146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt func_name, args->id); 34151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 34161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: BSS %d not found", 34171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt func_name, args->id); 34181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 34191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 34201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return res; 34218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 34228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 34258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_bssid - Return the BSSID of a BSS 34261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 34271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 34281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 34291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 34308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 34318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSID" property. 34328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 34331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_bssid(DBusMessageIter *iter, DBusError *error, 34341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 34358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 34361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 34371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 34388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 34401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 34411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 34428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE, 34441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res->bssid, ETH_ALEN, 34451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 34468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 34478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 34508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ssid - Return the SSID of a BSS 34511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 34521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 34531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 34541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 34558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 34568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "SSID" property. 34578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 34581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_ssid(DBusMessageIter *iter, DBusError *error, 34591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 34608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 34611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 34621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 34638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 34651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 34661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 34678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE, 34691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res->ssid, res->ssid_len, 34701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 34718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 34728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 34758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_privacy - Return the privacy flag of a BSS 34761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 34771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 34781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 34791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 34808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 34818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Privacy" property. 34828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 34831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_privacy(DBusMessageIter *iter, 34841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 34858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 34861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 34871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 34888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t privacy; 34898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 34911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 34921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 34938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt privacy = (res->caps & IEEE80211_CAP_PRIVACY) ? TRUE : FALSE; 34951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 34961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &privacy, error); 34978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 34988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 35018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_mode - Return the mode of a BSS 35021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 35031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 35041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 35051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 35068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 35078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Mode" property. 35088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 35091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_mode(DBusMessageIter *iter, DBusError *error, 35101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 35118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 35131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 35148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *mode; 35158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 35171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 35181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 351976cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt if (bss_is_dmg(res)) { 352076cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt switch (res->caps & IEEE80211_CAP_DMG_MASK) { 352176cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt case IEEE80211_CAP_DMG_PBSS: 352276cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt case IEEE80211_CAP_DMG_IBSS: 352376cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt mode = "ad-hoc"; 352476cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt break; 352576cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt case IEEE80211_CAP_DMG_AP: 352676cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt mode = "infrastructure"; 352776cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt break; 352876cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt } 352976cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt } else { 353076cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt if (res->caps & IEEE80211_CAP_IBSS) 353176cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt mode = "ad-hoc"; 353276cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt else 353376cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt mode = "infrastructure"; 353476cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt } 35358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 35371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &mode, error); 35388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 35428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_level - Return the signal strength of a BSS 35431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 35441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 35451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 35461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 35478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 35488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Level" property. 35498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 35501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_signal(DBusMessageIter *iter, 35511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 35528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 35541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 3555c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt s16 level; 35568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 35581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 35591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 35608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3561c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt level = (s16) res->level; 35621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT16, 3563c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt &level, error); 35648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 35688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_frequency - Return the frequency of a BSS 35691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 35701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 35711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 35721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 35738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 35748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Frequency" property. 35758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 35761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_frequency(DBusMessageIter *iter, 35771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 35788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 35801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 3581c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt u16 freq; 35828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 35841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 35851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 35868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3587c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt freq = (u16) res->freq; 35881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT16, 3589c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt &freq, error); 35908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int cmp_u8s_desc(const void *a, const void *b) 35948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return (*(u8 *) b - *(u8 *) a); 35968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 36008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rates - Return available bit rates of a BSS 36011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 36021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 36031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 36041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 36058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 36068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Rates" property. 36078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 36081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_rates(DBusMessageIter *iter, 36091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 36108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 36111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 36121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 36138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *ie_rates = NULL; 36148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u32 *real_rates; 36158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int rates_num, i; 36161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 36178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 36191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 36201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 36218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt rates_num = wpa_bss_get_bit_rates(res, &ie_rates); 36238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (rates_num < 0) 36241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 36258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt qsort(ie_rates, rates_num, 1, cmp_u8s_desc); 36278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt real_rates = os_malloc(sizeof(u32) * rates_num); 36298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!real_rates) { 36308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ie_rates); 36311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 36321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 36338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 36348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < rates_num; i++) 36368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt real_rates[i] = ie_rates[i] * 500000; 36378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_UINT32, 36391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt real_rates, rates_num, 36401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 36418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ie_rates); 36438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(real_rates); 36441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 36458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 36468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic dbus_bool_t wpas_dbus_get_bss_security_prop(DBusMessageIter *iter, 36491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_ie_data *ie_data, 36501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error) 36518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 36521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter iter_dict, variant_iter; 36538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *group; 3654fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt const char *pairwise[5]; /* max 5 pairwise ciphers is supported */ 3655807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt const char *key_mgmt[9]; /* max 9 key managements may be supported */ 36568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int n; 36578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 36598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "a{sv}", &variant_iter)) 36608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 36618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict)) 36638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 36648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* KeyMgmt */ 36668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt n = 0; 36678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK) 36688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-psk"; 36698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_PSK) 36708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-ft-psk"; 36718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK_SHA256) 36728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-psk-sha256"; 36738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X) 36748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-eap"; 36758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X) 36768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-ft-eap"; 36778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256) 36788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-eap-sha256"; 3679807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#ifdef CONFIG_SUITEB 36806c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B) 36816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt key_mgmt[n++] = "wpa-eap-suite-b"; 3682807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#endif /* CONFIG_SUITEB */ 3683807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#ifdef CONFIG_SUITEB192 3684807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B_192) 3685807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt key_mgmt[n++] = "wpa-eap-suite-b-192"; 3686807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#endif /* CONFIG_SUITEB192 */ 36878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_NONE) 36888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-none"; 36898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array(&iter_dict, "KeyMgmt", 36918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt, n)) 36928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 36938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Group */ 36958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (ie_data->group_cipher) { 36968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_WEP40: 36978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "wep40"; 36988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 36998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_TKIP: 37008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "tkip"; 37018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 37028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_CCMP: 37038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "ccmp"; 37048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 370561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt case WPA_CIPHER_GCMP: 370661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt group = "gcmp"; 370761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt break; 37088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_WEP104: 37098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "wep104"; 37108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 3711fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt case WPA_CIPHER_CCMP_256: 3712fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt group = "ccmp-256"; 3713fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt break; 3714fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt case WPA_CIPHER_GCMP_256: 3715fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt group = "gcmp-256"; 3716fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt break; 37178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 37188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = ""; 37198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 37208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 37218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string(&iter_dict, "Group", group)) 37238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 37248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Pairwise */ 37268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt n = 0; 37278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_TKIP) 37288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pairwise[n++] = "tkip"; 37298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_CCMP) 37308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pairwise[n++] = "ccmp"; 373161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_GCMP) 373261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pairwise[n++] = "gcmp"; 3733fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_CCMP_256) 3734fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt pairwise[n++] = "ccmp-256"; 3735fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_GCMP_256) 3736fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt pairwise[n++] = "gcmp-256"; 37378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array(&iter_dict, "Pairwise", 37398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pairwise, n)) 37408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 37418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Management group (RSN only) */ 37438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->proto == WPA_PROTO_RSN) { 37448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (ie_data->mgmt_group_cipher) { 37458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 37468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_AES_128_CMAC: 37478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "aes128cmac"; 37488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 37498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 37508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 37518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = ""; 37528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 37538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 37548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string(&iter_dict, "MgmtGroup", 37568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group)) 37578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 37588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 37598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict) || 37616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) 37628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 37638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 37658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem: 37671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 37681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 37698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 37708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 37738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_wpa - Return the WPA options of a BSS 37741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 37751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 37761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 37771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 37788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 37798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "WPA" property. 37808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 37811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_wpa(DBusMessageIter *iter, DBusError *error, 37821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 37838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 37841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 37851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 37868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ie_data wpa_data; 37878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *ie; 37888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 37901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 37911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 37928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&wpa_data, 0, sizeof(wpa_data)); 37948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie = wpa_bss_get_vendor_ie(res, WPA_IE_VENDOR_TYPE); 37956c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (ie && wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0) { 37966c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 37976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "failed to parse WPA IE"); 37986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return FALSE; 37998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 38008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_get_bss_security_prop(iter, &wpa_data, error); 38028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 38038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 38068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rsn - Return the RSN options of a BSS 38071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 38081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 38091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 38101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 38118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 38128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "RSN" property. 38138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 38141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_rsn(DBusMessageIter *iter, DBusError *error, 38151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 38168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 38171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 38181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 38198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ie_data wpa_data; 38208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *ie; 38218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 38231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 38241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 38258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&wpa_data, 0, sizeof(wpa_data)); 38278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie = wpa_bss_get_ie(res, WLAN_EID_RSN); 38286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (ie && wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0) { 38296c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 38306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "failed to parse RSN IE"); 38316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return FALSE; 38328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 38338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_get_bss_security_prop(iter, &wpa_data, error); 38358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 38368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 3839d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * wpas_dbus_getter_bss_wps - Return the WPS options of a BSS 3840d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @iter: Pointer to incoming dbus message iter 3841d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @error: Location to store error on failure 3842d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @user_data: Function specific data 3843d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Returns: TRUE on success, FALSE on failure 3844d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * 3845d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Getter for "WPS" property. 3846d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt */ 3847d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_wps(DBusMessageIter *iter, DBusError *error, 3848d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt void *user_data) 3849d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{ 3850d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt struct bss_handler_args *args = user_data; 3851d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt struct wpa_bss *res; 3852d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_WPS 3853d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt struct wpabuf *wps_ie; 3854d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_WPS */ 3855d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt DBusMessageIter iter_dict, variant_iter; 38568347444e0bfb85e4550817fc99903f38ce8f5bccDmitry Shmidt int wps_support = 0; 3857d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt const char *type = ""; 3858d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3859d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt res = get_bss_helper(args, error, __func__); 3860d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (!res) 3861d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return FALSE; 3862d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3863d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 38646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "a{sv}", &variant_iter) || 38656c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_open_write(&variant_iter, &iter_dict)) 3866d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt goto nomem; 3867d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3868d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_WPS 3869d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt wps_ie = wpa_bss_get_vendor_ie_multi(res, WPS_IE_VENDOR_TYPE); 3870d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (wps_ie) { 38718347444e0bfb85e4550817fc99903f38ce8f5bccDmitry Shmidt wps_support = 1; 3872d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (wps_is_selected_pbc_registrar(wps_ie)) 3873d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt type = "pbc"; 3874d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt else if (wps_is_selected_pin_registrar(wps_ie)) 3875d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt type = "pin"; 38766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 38776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpabuf_free(wps_ie); 3878d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt } 3879d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_WPS */ 3880d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 38818347444e0bfb85e4550817fc99903f38ce8f5bccDmitry Shmidt if ((wps_support && !wpa_dbus_dict_append_string(&iter_dict, "Type", type)) || 38826c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_close_write(&variant_iter, &iter_dict) || 38836c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) 3884d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt goto nomem; 3885d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3886d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return TRUE; 3887d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3888d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtnomem: 3889d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 3890d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return FALSE; 3891d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt} 3892d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3893d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3894d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt/** 38958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ies - Return all IEs of a BSS 38961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 38971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 38981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 38991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 39008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 39018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "IEs" property. 39028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 39031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_ies(DBusMessageIter *iter, DBusError *error, 39041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 39058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 39061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 39071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 39088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 39101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 39111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 39128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE, 39141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res + 1, res->ie_len, 39151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 39168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 39178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 3920661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * wpas_dbus_getter_bss_age - Return time in seconds since BSS was last seen 3921661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 3922661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @error: Location to store error on failure 3923661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @user_data: Function specific data 3924661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Returns: TRUE on success, FALSE on failure 3925661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * 3926661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Getter for BSS age 3927661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt */ 3928661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_age(DBusMessageIter *iter, DBusError *error, 3929661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt void *user_data) 3930661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt{ 3931661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt struct bss_handler_args *args = user_data; 3932661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt struct wpa_bss *res; 3933661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt struct os_reltime now, diff = { 0, 0 }; 3934661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt u32 age; 3935661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 3936661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt res = get_bss_helper(args, error, __func__); 3937661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (!res) 3938661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt return FALSE; 3939661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 3940661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt os_get_reltime(&now); 3941661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt os_reltime_sub(&now, &res->last_update, &diff); 3942661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt age = diff.sec > 0 ? diff.sec : 0; 3943661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, &age, 3944661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt error); 3945661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt} 3946661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 3947661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 3948661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt/** 39498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_enabled - Check whether network is enabled or disabled 39501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 39511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 39521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 39531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 39548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 39558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "enabled" property of a configured network. 39568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 39571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_enabled(DBusMessageIter *iter, DBusError *error, 39581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 39598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 39601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct network_handler_args *net = user_data; 39618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t enabled = net->ssid->disabled ? FALSE : TRUE; 39621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 39631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 39641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &enabled, error); 39658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 39668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 39698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_enabled - Mark a configured network as enabled or disabled 39701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 39711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 39721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 39731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 39748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 39758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Enabled" property of a configured network. 39768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 39771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_enabled(DBusMessageIter *iter, DBusError *error, 39781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 39798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 39801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct network_handler_args *net = user_data; 39818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 39828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 39838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t enable; 39848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, 39861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &enable)) 39871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 39888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s = net->wpa_s; 39908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = net->ssid; 39918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (enable) 39938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_enable_network(wpa_s, ssid); 39948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 39958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_disable_network(wpa_s, ssid); 39968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 39988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 39998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 40028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_network_properties - Get options for a configured network 40031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 40041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 40051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 40061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 40078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 40088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Properties" property of a configured network. 40098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 40101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_network_properties(DBusMessageIter *iter, 40111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 40121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 40138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 40141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct network_handler_args *net = user_data; 40151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter, dict_iter; 40168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **iterator; 40178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **props = wpa_config_get_all(net->ssid, 1); 40181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 40198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!props) { 40211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 40221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 40238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 40248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, "a{sv}", 40261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &variant_iter) || 40278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !wpa_dbus_dict_open_write(&variant_iter, &dict_iter)) { 40281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 40298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 40308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 40318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator = props; 40338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*iterator) { 40348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string(&dict_iter, *iterator, 40358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *(iterator + 1))) { 40361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, 40371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "no memory"); 40388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 40398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 40408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator += 2; 40418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 40428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_close_write(&variant_iter, &dict_iter) || 40451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) { 40461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 40478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 40488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 40498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = TRUE; 40511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 40528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 40538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator = props; 40548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*iterator) { 40558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(*iterator); 40568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator++; 40578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 40588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(props); 40591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 40608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 40618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 40648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_network_properties - Set options for a configured network 40651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 40661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 40671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 40681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 40698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 40708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Properties" property of a configured network. 40718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 40721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_network_properties(DBusMessageIter *iter, 40731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 40741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 40758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 40761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct network_handler_args *net = user_data; 40778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid = net->ssid; 40781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter; 40798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_message_iter_recurse(iter, &variant_iter); 40811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return set_network_properties(net->wpa_s, ssid, &variant_iter, error); 40828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 408304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 408404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 408504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AP 408604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 408704949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_subscribe_preq( 408804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessage *message, struct wpa_supplicant *wpa_s) 408904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 409004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpas_dbus_priv *priv = wpa_s->global->dbus; 409104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *name; 409204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 409304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_s->preq_notify_peer != NULL) { 409404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strcmp(dbus_message_get_sender(message), 409504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->preq_notify_peer) == 0) 409604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 409704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 409804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return dbus_message_new_error(message, 409904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_DBUS_ERROR_SUBSCRIPTION_IN_USE, 410004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "Another application is already subscribed"); 410104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 410204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 410304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt name = os_strdup(dbus_message_get_sender(message)); 410404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!name) 41056c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpas_dbus_error_no_memory(message); 410604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 410704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->preq_notify_peer = name; 410804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 410904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* Subscribe to clean up if application closes socket */ 411004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpas_dbus_subscribe_noc(priv); 411104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 411204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* 411304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Double-check it's still alive to make sure that we didn't 411404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * miss the NameOwnerChanged signal, e.g. while strdup'ing. 411504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 411604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_bus_name_has_owner(priv->con, name, NULL)) { 411704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* 411804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Application no longer exists, clean up. 411904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * The return value is irrelevant now. 412004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 412104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Need to check if the NameOwnerChanged handling 412204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * already cleaned up because we have processed 412304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * DBus messages while checking if the name still 412404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * has an owner. 412504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 412604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpa_s->preq_notify_peer) 412704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 412804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(wpa_s->preq_notify_peer); 412904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->preq_notify_peer = NULL; 413004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpas_dbus_unsubscribe_noc(priv); 413104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 413204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 413304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 413404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 413504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 413604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 413704949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_unsubscribe_preq( 413804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessage *message, struct wpa_supplicant *wpa_s) 413904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 414004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpas_dbus_priv *priv = wpa_s->global->dbus; 414104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 414204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpa_s->preq_notify_peer) 414304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return dbus_message_new_error(message, 414404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_DBUS_ERROR_NO_SUBSCRIPTION, 414504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "Not subscribed"); 414604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 414704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strcmp(wpa_s->preq_notify_peer, 414804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_get_sender(message))) 414904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return dbus_message_new_error(message, 415004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_DBUS_ERROR_SUBSCRIPTION_EPERM, 415104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "Can't unsubscribe others"); 415204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 415304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(wpa_s->preq_notify_peer); 415404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->preq_notify_peer = NULL; 415504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpas_dbus_unsubscribe_noc(priv); 415604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 415704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 415804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 415904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 416004949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid wpas_dbus_signal_preq(struct wpa_supplicant *wpa_s, 416104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const u8 *addr, const u8 *dst, const u8 *bssid, 416204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const u8 *ie, size_t ie_len, u32 ssi_signal) 416304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 416404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessage *msg; 416504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessageIter iter, dict_iter; 416604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpas_dbus_priv *priv = wpa_s->global->dbus; 416704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 416804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* Do nothing if the control interface is not turned on */ 4169cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (priv == NULL || !wpa_s->dbus_new_path) 417004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return; 417104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 417204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_s->preq_notify_peer == NULL) 417304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return; 417404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 417504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt msg = dbus_message_new_signal(wpa_s->dbus_new_path, 417604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_DBUS_NEW_IFACE_INTERFACE, 417704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "ProbeRequest"); 417804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (msg == NULL) 417904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return; 418004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 418104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_set_destination(msg, wpa_s->preq_notify_peer); 418204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 418304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_iter_init_append(msg, &iter); 418404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 41856c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!wpa_dbus_dict_open_write(&iter, &dict_iter) || 41866c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (addr && !wpa_dbus_dict_append_byte_array(&dict_iter, "addr", 41876c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (const char *) addr, 41886c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ETH_ALEN)) || 41896c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (dst && !wpa_dbus_dict_append_byte_array(&dict_iter, "dst", 41906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (const char *) dst, 41916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ETH_ALEN)) || 41926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (bssid && !wpa_dbus_dict_append_byte_array(&dict_iter, "bssid", 41936c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (const char *) bssid, 41946c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ETH_ALEN)) || 41956c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (ie && ie_len && !wpa_dbus_dict_append_byte_array(&dict_iter, "ies", 41966c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (const char *) ie, 41976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ie_len)) || 41986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (ssi_signal && !wpa_dbus_dict_append_int32(&dict_iter, "signal", 41996c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ssi_signal)) || 42006c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_close_write(&iter, &dict_iter)) 420104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto fail; 420204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 420304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_connection_send(priv->con, msg, NULL); 420404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto out; 420504949598a23f501be6eec21697465fd46a28840aDmitry Shmidtfail: 420604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "dbus: Failed to construct signal"); 420704949598a23f501be6eec21697465fd46a28840aDmitry Shmidtout: 420804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_unref(msg); 420904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 421004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 421104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AP */ 4212