18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * WPA Supplicant / dbus-based control interface 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2006, Dan Williams <dcbw@redhat.com> and Red Hat, Inc. 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2009-2010, Witold Sowa <witold.sowa@gmail.com> 5807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt * Copyright (c) 2009-2015, Jouni Malinen <j@w1.fi> 68d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * This software may be distributed under the terms of the BSD license. 804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * See README for more details. 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "includes.h" 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common.h" 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/ieee802_11_defs.h" 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "eap_peer/eap_methods.h" 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "eapol_supp/eapol_supp_sm.h" 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "rsn_supp/wpa.h" 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../config.h" 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../wpa_supplicant_i.h" 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../driver_i.h" 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../notify.h" 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../bss.h" 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../scan.h" 2404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include "../autoscan.h" 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_new_helpers.h" 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_new.h" 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_new_handlers.h" 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_dict_helpers.h" 2904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include "dbus_common_i.h" 30661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt#include "drivers/driver.h" 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidtstatic const char * const debug_strings[] = { 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "excessive", "msgdump", "debug", "info", "warning", "error", NULL 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt * wpas_dbus_error_unknown_error - Return a new UnknownError error message 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @arg: Optional string appended to error message 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an UnknownError 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_error_unknown_error(DBusMessage *message, 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *arg) 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_UNKNOWN_ERROR, 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt arg); 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_iface_unknown - Return a new invalid interface error message 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus error message 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid interface error 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic DBusMessage * wpas_dbus_error_iface_unknown(DBusMessage *message) 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return dbus_message_new_error( 636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, WPAS_DBUS_ERROR_IFACE_UNKNOWN, 646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "wpa_supplicant knows nothing about this interface."); 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_network_unknown - Return a new NetworkUnknown error message 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid network error 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic DBusMessage * wpas_dbus_error_network_unknown(DBusMessage *message) 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return dbus_message_new_error( 786c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, WPAS_DBUS_ERROR_NETWORK_UNKNOWN, 796c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "There is no such a network in this interface."); 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_invalid_args - Return a new InvalidArgs error message 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid options error 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_error_invalid_args(DBusMessage *message, 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *arg) 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply; 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 956c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = dbus_message_new_error( 966c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, WPAS_DBUS_ERROR_INVALID_ARGS, 976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Did not receive correct message arguments."); 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (arg != NULL) 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_append_args(reply, DBUS_TYPE_STRING, &arg, 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1067dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt/** 1077dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * wpas_dbus_error_scan_error - Return a new ScanError error message 1087dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 1097dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @error: Optional string to be used as the error message 1107dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * Returns: a dbus error message 1117dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * 1127dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * Convenience function to create and return a scan error 1137dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt */ 1146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidtstatic DBusMessage * wpas_dbus_error_scan_error(DBusMessage *message, 1156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt const char *error) 1167dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt{ 1176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return dbus_message_new_error(message, 1186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt WPAS_DBUS_ERROR_IFACE_SCAN_ERROR, 1196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt error); 1206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt} 1217dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt 1227dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt 1236c0da2bb83f6915d8260912362692d1a742e057bDmitry ShmidtDBusMessage * wpas_dbus_error_no_memory(DBusMessage *message) 1246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt{ 1256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, "dbus: Failed to allocate memory"); 1266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, NULL); 1277dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt} 1287dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt 1297dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt 1306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidtstatic const char * const dont_quote[] = { 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "key_mgmt", "proto", "pairwise", "auth_alg", "group", "eap", 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "opensc_engine_path", "pkcs11_engine_path", "pkcs11_module_path", 133d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt "bssid", "scan_freq", "freq_list", NULL 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic dbus_bool_t should_quote_opt(const char *key) 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i = 0; 1396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dont_quote[i] != NULL) { 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(key, dont_quote[i]) == 0) 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return FALSE; 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt i++; 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return TRUE; 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * get_iface_by_dbus_path - Get a new network interface 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: Pointer to global data from wpa_supplicant_init() 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @path: Pointer to a dbus object path representing an interface 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Pointer to the interface or %NULL if not found 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_supplicant * get_iface_by_dbus_path( 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global, const char *path) 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) { 160cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s->dbus_new_path && 161cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt os_strcmp(wpa_s->dbus_new_path, path) == 0) 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_s; 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * set_network_properties - Set properties of a configured network 1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @ssid: wpa_ssid structure for a configured network 1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @iter: DBus message iterator containing dictionary of network 1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * properties to set. 1741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: On failure, an error describing the failure 1751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request succeeds, FALSE if it failed 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Sets network configuration with parameters given id DBus dictionary 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t set_network_properties(struct wpa_supplicant *wpa_s, 1801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_ssid *ssid, 1811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter *iter, 1821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error) 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_dbus_dict_entry entry = { .type = DBUS_TYPE_STRING }; 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter_dict; 1861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char *value = NULL; 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpa_dbus_dict_open_read(iter, &iter_dict, error)) 1891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (wpa_dbus_dict_has_dict_entry(&iter_dict)) { 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t size = 50; 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 1941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpa_dbus_dict_get_entry(&iter_dict, &entry)) 1961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto error; 1971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt value = NULL; 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (entry.type == DBUS_TYPE_ARRAY && 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.array_type == DBUS_TYPE_BYTE) { 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (entry.array_len <= 0) 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size = entry.array_len * 2 + 1; 2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = wpa_snprintf_hex(value, size, 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (u8 *) entry.bytearray_value, 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.array_len); 2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret <= 0) 2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (entry.type == DBUS_TYPE_STRING) { 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (should_quote_opt(entry.key)) { 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size = os_strlen(entry.str_value); 2174171258d30a612645aa061cede62233b5c58ca2aDmitry Shmidt if (size == 0) 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size += 3; 2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(value, size, "\"%s\"", 2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.str_value); 2276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(size, ret)) 2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_strdup(entry.str_value); 2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (entry.type == DBUS_TYPE_UINT32) { 2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(value, size, "%u", 2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.uint32_value); 2416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(size, ret)) 2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (entry.type == DBUS_TYPE_INT32) { 2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(value, size, "%d", 2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.int32_value); 2506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(size, ret)) 2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else 2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_set(ssid, entry.key, value, 0) < 0) 2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2582f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt if (os_strcmp(entry.key, "bssid") != 0 && 2592f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt os_strcmp(entry.key, "priority") != 0) 2602f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt wpa_sm_pmksa_cache_flush(wpa_s->wpa, ssid); 2612f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt 2622f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt if (wpa_s->current_ssid == ssid || 2632f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt wpa_s->current_ssid == NULL) { 2642f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt /* 2652f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt * Invalidate the EAP session cache if anything in the 2662f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt * current or previously used configuration changes. 2672f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt */ 2682f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt eapol_sm_invalidate_cached_session(wpa_s->eapol); 2692f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt } 2702f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt 2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((os_strcmp(entry.key, "psk") == 0 && 2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value[0] == '"' && ssid->ssid_len) || 27304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt (os_strcmp(entry.key, "ssid") == 0 && ssid->passphrase)) 2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_update_psk(ssid); 2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (os_strcmp(entry.key, "priority") == 0) 2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_update_prio_list(wpa_s->conf); 2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 279623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt value = NULL; 2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 2841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidterror: 2861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(value); 2871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 2881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_INVALID_ARGS, 2891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "invalid message format"); 2901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_property_getter - Get basic type property 2961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Message iter to use when appending arguments 2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property (must be basic type) 2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @val: pointer to place holding property value 2991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: On failure an error describing the failure 3001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request was successful, FALSE if it failed 3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic getter for basic type properties. Type is required to be basic. 3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_property_getter(DBusMessageIter *iter, 3051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const int type, 3061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const void *val, 3071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error) 3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter; 3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_type_is_basic(type)) { 3121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: given type is not basic", __func__); 3141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 3186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_dbus_type_as_string(type), 3196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &variant_iter) || 3206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_append_basic(&variant_iter, type, val) || 3216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) { 3226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3236c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: error constructing reply", __func__); 3246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return FALSE; 3256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt } 3261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_property_setter - Set basic type property 3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property (must be basic type) 3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @val: pointer to place where value being set will be stored 3361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request was successful, FALSE if it failed 3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic setter for basic type properties. Type is required to be basic. 3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_property_setter(DBusMessageIter *iter, 3411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 3421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const int type, void *val) 3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter; 3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_type_is_basic(type)) { 3471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: given type is not basic", __func__); 3491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Look at the new value */ 3531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_message_iter_recurse(iter, &variant_iter); 3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&variant_iter) != type) { 3551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 3561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "wrong property type"); 3571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&variant_iter, val); 3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_array_property_getter - Get array type property 3671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iterator 3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property array elements (must be basic type) 3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @array: pointer to array of elements to put into response message 3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @array_len: length of above array 3711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: a pointer to an error to fill on failure 3721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request succeeded, FALSE if it failed 3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic getter for array type properties. Array elements type is 3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * required to be basic. 3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_array_property_getter(DBusMessageIter *iter, 3781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const int type, 3791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const void *array, 3801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt size_t array_len, 3811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error) 3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter, array_iter; 3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char type_str[] = "a?"; /* ? will be replaced with subtype letter; */ 3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *sub_type_str; 3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t element_size, i; 3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_type_is_basic(type)) { 3891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: given type is not basic", __func__); 3911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sub_type_str = wpa_dbus_type_as_string(type); 3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt type_str[1] = sub_type_str[0]; 3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 3986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt type_str, &variant_iter) || 3996c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY, 4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sub_type_str, &array_iter)) { 4011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 4026c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: failed to construct message", __func__); 4031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt switch (type) { 4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_BYTE: 4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_BOOLEAN: 4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = 1; 4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_INT16: 4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_UINT16: 4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(uint16_t); 4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_INT32: 4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_UINT32: 4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(uint32_t); 4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_INT64: 4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_UINT64: 4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(uint64_t); 4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_DOUBLE: 4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(double); 4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_STRING: 4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_OBJECT_PATH: 4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(char *); 4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 4311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 4326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: unknown element type %d", __func__, type); 4331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < array_len; i++) { 43743cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt if (!dbus_message_iter_append_basic(&array_iter, type, 438b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt (const char *) array + 439b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt i * element_size)) { 44043cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 44143cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt "%s: failed to construct message 2.5", 44243cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt __func__); 44343cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt return FALSE; 44443cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt } 4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!dbus_message_iter_close_container(&variant_iter, &array_iter) || 4486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) { 4491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 4506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: failed to construct message 3", __func__); 4511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 4521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 4531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 4541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 45904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_simple_array_array_property_getter - Get array array type property 46004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iterator 46104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @type: DBus type of property array elements (must be basic type) 46204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @array: pointer to array of elements to put into response message 46304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @array_len: length of above array 46404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: a pointer to an error to fill on failure 46504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE if the request succeeded, FALSE if it failed 46604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 46704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Generic getter for array type properties. Array elements type is 46804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * required to be basic. 46904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 47004949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_simple_array_array_property_getter(DBusMessageIter *iter, 47104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const int type, 47204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpabuf **array, 47304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt size_t array_len, 47404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusError *error) 47504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 47604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessageIter variant_iter, array_iter; 47704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char type_str[] = "aa?"; 47804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char inner_type_str[] = "a?"; 47904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const char *sub_type_str; 48004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt size_t i; 48104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 48204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_type_is_basic(type)) { 48304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 48404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "%s: given type is not basic", __func__); 48504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 48604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 48704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 48804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt sub_type_str = wpa_dbus_type_as_string(type); 48904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt type_str[2] = sub_type_str[0]; 49004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt inner_type_str[1] = sub_type_str[0]; 49104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 49204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 4936c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt type_str, &variant_iter) || 4946c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY, 49504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt inner_type_str, &array_iter)) { 49604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 4976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: failed to construct message", __func__); 49804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 49904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 50004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 501c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt for (i = 0; i < array_len && array[i]; i++) { 50204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_dbus_dict_bin_array_add_element(&array_iter, 50304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpabuf_head(array[i]), 50404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpabuf_len(array[i])); 50504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 50604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 50704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 5086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!dbus_message_iter_close_container(&variant_iter, &array_iter) || 5096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) { 51004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 5116c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: failed to close message", __func__); 51204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 51304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 51404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 51504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return TRUE; 51604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 51704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 51804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 51904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 520293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt * wpas_dbus_string_property_getter - Get string type property 521293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt * @iter: Message iter to use when appending arguments 522293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt * @val: Pointer to place holding property value, can be %NULL 523293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt * @error: On failure an error describing the failure 524293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt * Returns: TRUE if the request was successful, FALSE if it failed 525293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt * 526293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt * Generic getter for string type properties. %NULL is converted to an empty 527293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt * string. 528293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt */ 529293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidtdbus_bool_t wpas_dbus_string_property_getter(DBusMessageIter *iter, 530293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt const void *val, 531293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt DBusError *error) 532293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt{ 533293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt if (!val) 534293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt val = ""; 535293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 536293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt &val, error); 537293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt} 538293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt 539293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt 540293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt/** 5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_create_interface - Request registration of a network iface 5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure 5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the new interface object, 5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or a dbus error message with more information 5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "CreateInterface" method call. Handles requests 5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to register a network interface that wpa_supplicant 5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * will manage. 5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_create_interface(DBusMessage *message, 5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter_dict; 5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter; 5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_dbus_dict_entry entry; 5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *driver = NULL; 5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *ifname = NULL; 5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *confname = NULL; 5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *bridge_ifname = NULL; 5628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 5648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpa_dbus_dict_open_read(&iter, &iter_dict, NULL)) 5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (wpa_dbus_dict_has_dict_entry(&iter_dict)) { 5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_get_entry(&iter_dict, &entry)) 5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 5706c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_strcmp(entry.key, "Driver") == 0 && 5716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt entry.type == DBUS_TYPE_STRING) { 572623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt os_free(driver); 5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt driver = os_strdup(entry.str_value); 5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (driver == NULL) 576ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt goto oom; 5776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt } else if (os_strcmp(entry.key, "Ifname") == 0 && 5786c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt entry.type == DBUS_TYPE_STRING) { 579623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt os_free(ifname); 5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ifname = os_strdup(entry.str_value); 5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ifname == NULL) 583ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt goto oom; 5846c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt } else if (os_strcmp(entry.key, "ConfigFile") == 0 && 5856c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt entry.type == DBUS_TYPE_STRING) { 586623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt os_free(confname); 5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt confname = os_strdup(entry.str_value); 5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (confname == NULL) 590ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt goto oom; 5916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt } else if (os_strcmp(entry.key, "BridgeIfname") == 0 && 5926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt entry.type == DBUS_TYPE_STRING) { 593623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt os_free(bridge_ifname); 5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bridge_ifname = os_strdup(entry.str_value); 5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bridge_ifname == NULL) 597ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt goto oom; 5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ifname == NULL) 6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; /* Required Ifname argument missing */ 6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Try to get the wpa_supplicant record for this iface, return 6098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * an error if we already control it. 6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 6118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_get_iface(global, ifname) != NULL) { 6126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = dbus_message_new_error( 6136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, WPAS_DBUS_ERROR_IFACE_EXISTS, 6146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "wpa_supplicant already controls this interface."); 6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_interface iface; 6186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 6198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&iface, 0, sizeof(iface)); 6208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.driver = driver; 6218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.ifname = ifname; 6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.confname = confname; 6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.bridge_ifname = bridge_ifname; 6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Otherwise, have wpa_supplicant attach to it. */ 625203eadb9eda41a1dde4a583edb4684319e3f399eDmitry Shmidt wpa_s = wpa_supplicant_add_iface(global, &iface, NULL); 626cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s && wpa_s->dbus_new_path) { 6278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *path = wpa_s->dbus_new_path; 6286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 6298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 6308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, 6316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &path, DBUS_TYPE_INVALID); 6328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 6338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_unknown_error( 6346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 6356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "wpa_supplicant couldn't grab this interface."); 6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(driver); 6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ifname); 64261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_free(confname); 6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bridge_ifname); 6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterror: 6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, NULL); 6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 649ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidtoom: 650ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt reply = wpas_dbus_error_no_memory(message); 651ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt goto out; 6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_interface - Request deregistration of an interface 6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: wpa_supplicant global data structure 6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing a UINT32 indicating success (1) or 6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * failure (0), or returns a dbus error message with more information 6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "removeInterface" method call. Handles requests 6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to deregister a network interface that wpa_supplicant 6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * currently manages. 6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_interface(DBusMessage *message, 6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *path; 6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &path, 6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s = get_iface_by_dbus_path(global, path); 6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s == NULL) 6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_iface_unknown(message); 679c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt else if (wpa_supplicant_remove_iface(global, wpa_s, 0)) { 6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_unknown_error( 6816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 6826c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "wpa_supplicant couldn't remove this interface."); 6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_interface - Get the object path for an interface name 6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure 6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the interface object, 6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or a dbus error message with more information 6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "getInterface" method call. 6978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 6988d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_interface(DBusMessage *message, 6998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *ifname; 7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *path; 7048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 7058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &ifname, 7078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 7088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s = wpa_supplicant_get_iface(global, ifname); 710cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s == NULL || wpa_s->dbus_new_path == NULL) 7118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_error_iface_unknown(message); 7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt path = wpa_s->dbus_new_path; 7148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 7158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply == NULL) 7166c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpas_dbus_error_no_memory(message); 7178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path, 7188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID)) { 7198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 7206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpas_dbus_error_no_memory(message); 7218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 7248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_level - Get debug level 7291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 7301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 7311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 7321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 7338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugLevel" property. 7358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 736d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_level( 737d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 738d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 7398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *str; 7418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int idx = wpa_debug_level; 7421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 7438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (idx < 0) 7448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt idx = 0; 7458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (idx > 5) 7468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt idx = 5; 7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt str = debug_strings[idx]; 7481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 7491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &str, error); 7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_timestamp - Get debug timestamp 7551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 7561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 7571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 7581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 7598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugTimestamp" property. 7618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 762d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_timestamp( 763d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 764d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 7671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &wpa_debug_timestamp, error); 7688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_show_keys - Get debug show keys 7741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 7751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 7761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 7771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 7788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugShowKeys" property. 7808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 781d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_show_keys( 782d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 783d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 7848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 7861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &wpa_debug_show_keys, error); 7878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_level - Set debug level 7921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 7931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 7941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 7951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 7968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugLevel" property. 7988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 799d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_level( 800d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 801d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 8028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_global *global = user_data; 8048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *str = NULL; 8058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i, val = -1; 8068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING, 8081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &str)) 8091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 8108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; debug_strings[i]; i++) 8128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(debug_strings[i], str) == 0) { 8138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val = i; 8148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 8158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (val < 0 || 8188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_set_debug_params(global, val, wpa_debug_timestamp, 8198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_show_keys)) { 8206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 8216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "wrong debug level value"); 8221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 8238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 8268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 8308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_timestamp - Set debug timestamp 8311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 8321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 8331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 8341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 8358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 8368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugTimestamp" property. 8378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 838d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_timestamp( 839d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 840d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 8418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_global *global = user_data; 8438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t val; 8448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, 8461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &val)) 8471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 8488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_set_debug_params(global, wpa_debug_level, val ? 1 : 0, 8508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_show_keys); 8511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 8528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 8568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_show_keys - Set debug show keys 8571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 8581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 8591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 8601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 8618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 8628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugShowKeys" property. 8638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 864d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_show_keys( 865d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 866d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 8678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_global *global = user_data; 8698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t val; 8708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, 8721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &val)) 8731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 8748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_set_debug_params(global, wpa_debug_level, 8768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_timestamp, 8778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val ? 1 : 0); 8781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 8798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 8838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_interfaces - Request registered interfaces list 8841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 8851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 8861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 8871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 8888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 8898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Interfaces" property. Handles requests 8908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of registered interfaces objects 8918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * paths 8928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 893d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_interfaces( 894d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 895d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 8968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_global *global = user_data; 8988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 8998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char **paths; 9008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int i = 0, num = 0; 9011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success; 9028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 903cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) { 904cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s->dbus_new_path) 905cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt num++; 906cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } 9078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 90861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt paths = os_calloc(num, sizeof(char *)); 9098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!paths) { 9101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 9111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 9128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 914cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) { 915cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s->dbus_new_path) 916cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt paths[i++] = wpa_s->dbus_new_path; 917cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } 9188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, 9201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_OBJECT_PATH, 9211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt paths, num, error); 9228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths); 9241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 9258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 9298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_eap_methods - Request supported EAP methods list 9301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 9311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 9321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 9331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 9348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 9358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "EapMethods" property. Handles requests 9368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of strings with supported EAP methods 9378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 938d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_eap_methods( 939d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 940d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 9418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **eap_methods; 9438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t num_items = 0; 9441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success; 9458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eap_methods = eap_get_names_as_string_array(&num_items); 9478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!eap_methods) { 9481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 9491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 9508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, 9531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_STRING, 9541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt eap_methods, 9551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt num_items, error); 9568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (num_items) 9588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(eap_methods[--num_items]); 9598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(eap_methods); 9601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 9618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 964d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt/** 965d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * wpas_dbus_getter_global_capabilities - Request supported global capabilities 966d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @iter: Pointer to incoming dbus message iter 967d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @error: Location to store error on failure 968d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @user_data: Function specific data 969d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Returns: TRUE on success, FALSE on failure 970d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * 971d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Getter for "Capabilities" property. Handles requests by dbus clients to 972d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * return a list of strings with supported capabilities like AP, RSN IBSS, 973d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * and P2P that are determined at compile time. 974d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt */ 975d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_global_capabilities( 976d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 977d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 978d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{ 979d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt const char *capabilities[5] = { NULL, NULL, NULL, NULL, NULL }; 980d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt size_t num_items = 0; 981d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 982d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_AP 983d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities[num_items++] = "ap"; 984d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_AP */ 985d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_IBSS_RSN 986d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities[num_items++] = "ibss-rsn"; 987d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_IBSS_RSN */ 988d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_P2P 989d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities[num_items++] = "p2p"; 990d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_P2P */ 991d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_INTERWORKING 992d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities[num_items++] = "interworking"; 993d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_INTERWORKING */ 994092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart#ifdef CONFIG_IEEE80211W 995092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart capabilities[num_items++] = "pmf"; 996092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart#endif /* CONFIG_IEEE80211W */ 997d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 998d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return wpas_dbus_simple_array_property_getter(iter, 999d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt DBUS_TYPE_STRING, 1000d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities, 1001d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt num_items, error); 1002d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt} 1003d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 1004d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 10058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_type(DBusMessage *message, DBusMessageIter *var, 10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **type, DBusMessage **reply) 10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_STRING) { 10096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s[dbus]: Type must be a string", 10106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong Type value type. String required"); 10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(var, type); 10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 10178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ssids(DBusMessage *message, DBusMessageIter *var, 10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params *params, 10228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage **reply) 10238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_ssid *ssids = params->ssids; 10258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t ssids_num = 0; 10268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *ssid; 10278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter array_iter, sub_array_iter; 10288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *val; 10298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int len; 10308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) { 10326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 10336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: ssids must be an array of arrays of bytes", 10346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 10358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 10376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Wrong SSIDs value type. Array of arrays of bytes required"); 10388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(var, &array_iter); 10428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY || 10446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE) { 10456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 10466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: ssids must be an array of arrays of bytes", 10476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 10488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 10506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Wrong SSIDs value type. Array of arrays of bytes required"); 10518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10546c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY) { 10558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssids_num >= WPAS_MAX_SCAN_SSIDS) { 10566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 10576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: Too many ssids specified on scan dbus call", 10586c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 10598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 10616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Too many ssids specified. Specify at most four"); 10628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&array_iter, &sub_array_iter); 10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len); 10688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10699d9e60286e05ae45025b672636490bd12586138dDmitry Shmidt if (len > SSID_MAX_LEN) { 1070c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt wpa_printf(MSG_DEBUG, 10716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: SSID too long (len=%d max_len=%d)", 10729d9e60286e05ae45025b672636490bd12586138dDmitry Shmidt __func__, len, SSID_MAX_LEN); 1073c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 1074c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt message, "Invalid SSID: too long"); 1075c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return -1; 1076c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt } 1077c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (len != 0) { 10798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = os_malloc(len); 10808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 10816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt *reply = wpas_dbus_error_no_memory(message); 10828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(ssid, val, len); 10858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 10868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Allow zero-length SSIDs */ 10878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = NULL; 10888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssids[ssids_num].ssid = ssid; 10918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssids[ssids_num].ssid_len = len; 10928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 10948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssids_num++; 10958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->num_ssids = ssids_num; 10988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 10998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 11008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ies(DBusMessage *message, DBusMessageIter *var, 11038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params *params, 11048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage **reply) 11058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 11068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *ies = NULL, *nies; 11078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ies_len = 0; 11088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter array_iter, sub_array_iter; 11098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *val; 11108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int len; 11118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) { 11136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 11146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: ies must be an array of arrays of bytes", 11156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 11168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 11186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Wrong IEs value type. Array of arrays of bytes required"); 11198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(var, &array_iter); 11238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY || 11256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE) { 11266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 11276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: ies must be an array of arrays of bytes", 11286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 11298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong IEs value type. Array required"); 11318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY) { 11358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&array_iter, &sub_array_iter); 11368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len); 11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (len == 0) { 11398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 11408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 11418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nies = os_realloc(ies, ies_len + len); 11448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nies == NULL) { 11458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ies); 11466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt *reply = wpas_dbus_error_no_memory(message); 11478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ies = nies; 11508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(ies + ies_len, val, len); 11518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ies_len += len; 11528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 11548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->extra_ies = ies; 11578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->extra_ies_len = ies_len; 11588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 11598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 11608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_channels(DBusMessage *message, 11638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter *var, 11648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params *params, 11658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage **reply) 11668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 11678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter array_iter, sub_array_iter; 11688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int *freqs = NULL, *nfreqs; 11698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int freqs_num = 0; 11708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) { 11726c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 11736c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: Channels must be an array of structs", 11746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 11758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 11776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Wrong Channels value type. Array of structs required"); 11788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(var, &array_iter); 11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_STRUCT) { 11848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, 11856c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: Channels must be an array of structs", 11866c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 11878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11886c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 11896c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Wrong Channels value type. Array of structs required"); 11908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_STRUCT) 11948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 11958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int freq, width; 11968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&array_iter, &sub_array_iter); 11988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&sub_array_iter) != 12008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_UINT32) { 12016c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 12026c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: Channel must by specified by struct of two UINT32s %c", 12036c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__, 12048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_arg_type( 12058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &sub_array_iter)); 12068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 12076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 12086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Wrong Channel struct. Two UINT32s required"); 12098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 12108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&sub_array_iter, &freq); 12138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_next(&sub_array_iter) || 12158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_arg_type(&sub_array_iter) != 12168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_UINT32) { 12176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 12186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: Channel must by specified by struct of two UINT32s", 12196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 12208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 12218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, 12228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Wrong Channel struct. Two UINT32s required"); 12238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 12248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&sub_array_iter, &width); 12288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define FREQS_ALLOC_CHUNK 32 12308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (freqs_num % FREQS_ALLOC_CHUNK == 0) { 123161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt nfreqs = os_realloc_array( 123261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt freqs, freqs_num + FREQS_ALLOC_CHUNK, 123361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt sizeof(int)); 12348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nfreqs == NULL) 12358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 12368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs = nfreqs; 12378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (freqs == NULL) { 12396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt *reply = wpas_dbus_error_no_memory(message); 12408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs[freqs_num] = freq; 12448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs_num++; 12468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 12478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 124961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt nfreqs = os_realloc_array(freqs, freqs_num + 1, sizeof(int)); 12508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nfreqs == NULL) 12518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 12528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs = nfreqs; 12538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (freqs == NULL) { 12546c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt *reply = wpas_dbus_error_no_memory(message); 12558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs[freqs_num] = 0; 12588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->freqs = freqs; 12608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 12618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 12628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1264051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidtstatic int wpas_dbus_get_scan_allow_roam(DBusMessage *message, 1265051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt DBusMessageIter *var, 1266051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt dbus_bool_t *allow, 1267051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt DBusMessage **reply) 1268051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt{ 1269051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_BOOLEAN) { 12706c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s[dbus]: Type must be a boolean", 12716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 1272051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 1273051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt message, "Wrong Type value type. Boolean required"); 1274051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt return -1; 1275051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt } 1276051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt dbus_message_iter_get_basic(var, allow); 1277051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt return 0; 1278051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt} 1279051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 1280051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 12818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 12828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_scan - Request a wireless scan on an interface 12838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 12848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 12858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL indicating success or DBus error message on failure 12868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 12878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Scan" method call of a network device. Requests 12888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * that wpa_supplicant perform a wireless scan as soon as possible 12898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * on a particular wireless interface. 12908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 12918d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_scan(DBusMessage *message, 12928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 12938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 12948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 12958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, dict_iter, entry_iter, variant_iter; 12968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *key = NULL, *type = NULL; 12978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params params; 12988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t i; 1299051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt dbus_bool_t allow_roam = 1; 13008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(¶ms, 0, sizeof(params)); 13028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 13048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&iter, &dict_iter); 13068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dbus_message_iter_get_arg_type(&dict_iter) == 13086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt DBUS_TYPE_DICT_ENTRY) { 13098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&dict_iter, &entry_iter); 13108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&entry_iter, &key); 13118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&entry_iter); 13128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&entry_iter, &variant_iter); 13138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(key, "Type") == 0) { 13158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_type(message, &variant_iter, 13168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &type, &reply) < 0) 13178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(key, "SSIDs") == 0) { 13198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_ssids(message, &variant_iter, 13208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ¶ms, &reply) < 0) 13218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(key, "IEs") == 0) { 13238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_ies(message, &variant_iter, 13248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ¶ms, &reply) < 0) 13258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(key, "Channels") == 0) { 13278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_channels(message, &variant_iter, 13288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ¶ms, &reply) < 0) 13298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 1330051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt } else if (os_strcmp(key, "AllowRoam") == 0) { 1331051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt if (wpas_dbus_get_scan_allow_roam(message, 1332051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt &variant_iter, 1333051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt &allow_roam, 1334051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt &reply) < 0) 1335051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt goto out; 13368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 13376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s[dbus]: Unknown argument %s", 13386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__, key); 13398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, key); 13408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&dict_iter); 13448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!type) { 13476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s[dbus]: Scan type not specified", 13486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 13498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, key); 13508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13536c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_strcmp(type, "passive") == 0) { 13548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (params.num_ssids || params.extra_ies_len) { 13556c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 13566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: SSIDs or IEs specified for passive scan.", 13576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 13588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args( 13596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 13606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "You can specify only Channels in passive scan"); 13618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 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 1370cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (params.freqs && params.freqs[0]) { 1371d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt wpa_s->last_scan_req = MANUAL_SCAN_REQ; 1372cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_supplicant_trigger_scan(wpa_s, 1373cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt ¶ms)) { 1374cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt reply = wpas_dbus_error_scan_error( 1375cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt message, 1376cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt "Scan request rejected"); 1377cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } 1378cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } else { 1379cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt wpa_s->scan_req = MANUAL_SCAN_REQ; 1380cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt wpa_supplicant_req_scan(wpa_s, 0, 0); 1381cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } 13828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13836c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt } else if (os_strcmp(type, "active") == 0) { 13848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!params.num_ssids) { 13858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Add wildcard ssid */ 13868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.num_ssids++; 13878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 138804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN 138904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt autoscan_deinit(wpa_s); 139004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */ 1391cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s->sched_scanning) { 1392cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt wpa_printf(MSG_DEBUG, 1393cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt "%s[dbus]: Stop ongoing sched_scan to allow requested scan to proceed", 1394cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt __func__); 1395cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt wpa_supplicant_cancel_sched_scan(wpa_s); 1396cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } 1397cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt 1398d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt wpa_s->last_scan_req = MANUAL_SCAN_REQ; 13997dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt if (wpa_supplicant_trigger_scan(wpa_s, ¶ms)) { 14007dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt reply = wpas_dbus_error_scan_error( 14017dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt message, "Scan request rejected"); 14027dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt } 14038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 14046c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s[dbus]: Unknown scan type: %s", 14056c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__, type); 14068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, 14078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Wrong scan type"); 14088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 14098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1411051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt if (!allow_roam) 1412051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt wpa_s->scan_res_handler = scan_only_handler; 1413051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 14148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 14158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < WPAS_MAX_SCAN_SSIDS; i++) 14168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free((u8 *) params.ssids[i].ssid); 14178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free((u8 *) params.extra_ies); 14188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(params.freqs); 14198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 14208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 14218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1423661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt/** 1424661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * wpas_dbus_handler_signal_poll - Request immediate signal properties 1425661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @message: Pointer to incoming dbus message 1426661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 1427661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Returns: NULL indicating success or DBus error message on failure 1428661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * 1429661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Handler function for "SignalPoll" method call of a network device. Requests 1430661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * that wpa_supplicant read signal properties like RSSI, noise, and link 1431661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * speed and return them. 1432661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt */ 1433661b4f78e48c697429dc46154a4125892c001718Dmitry ShmidtDBusMessage * wpas_dbus_handler_signal_poll(DBusMessage *message, 1434661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt struct wpa_supplicant *wpa_s) 1435661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt{ 1436661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt struct wpa_signal_info si; 1437661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt DBusMessage *reply = NULL; 1438661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt DBusMessageIter iter, iter_dict, variant_iter; 1439661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt int ret; 1440661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1441661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt ret = wpa_drv_signal_poll(wpa_s, &si); 1442661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (ret) { 1443661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_FAILED, 1444661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt "Failed to read signal"); 1445661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt } 1446661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1447661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt reply = dbus_message_new_method_return(message); 1448661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (reply == NULL) 1449661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt goto nomem; 1450661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1451661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt dbus_message_iter_init_append(reply, &iter); 1452661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1453661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT, 14546c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "a{sv}", &variant_iter) || 14556c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_open_write(&variant_iter, &iter_dict) || 14566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_append_int32(&iter_dict, "rssi", 14576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt si.current_signal) || 14586c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_append_int32(&iter_dict, "linkspeed", 14596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt si.current_txrate / 1000) || 14606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_append_int32(&iter_dict, "noise", 14616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt si.current_noise) || 14626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_append_uint32(&iter_dict, "frequency", 14636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt si.frequency) || 14646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (si.chanwidth != CHAN_WIDTH_UNKNOWN && 14656c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_append_string( 14666c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_dict, "width", 14676c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt channel_width_to_string(si.chanwidth))) || 14686c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (si.center_frq1 > 0 && si.center_frq2 > 0 && 14696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (!wpa_dbus_dict_append_int32(&iter_dict, "center-frq1", 14706c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt si.center_frq1) || 14716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_append_int32(&iter_dict, "center-frq2", 14726c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt si.center_frq2))) || 14736c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (si.avg_signal && 14746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_append_int32(&iter_dict, "avg-rssi", 14756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt si.avg_signal)) || 14766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_close_write(&variant_iter, &iter_dict) || 14776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(&iter, &variant_iter)) 1478661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt goto nomem; 1479661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1480661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt return reply; 1481661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1482661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidtnomem: 1483661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (reply) 1484661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt dbus_message_unref(reply); 14856c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpas_dbus_error_no_memory(message); 1486661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt} 1487661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1488661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 14898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 14908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_disconnect - Terminate the current connection 14918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 14928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 14938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NotConnected DBus error message if already not connected 14948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or NULL otherwise. 14958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 14968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Disconnect" method call of network interface. 14978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 14988d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_disconnect(DBusMessage *message, 14998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 15008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 15018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->current_ssid != NULL) { 15027f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt wpas_request_disconnection(wpa_s); 15038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 15048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_NOT_CONNECTED, 15078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "This interface is not connected"); 15088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 15098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 15128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_add_network - Add a new configured network 15138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 15148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 15158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing the object path of the new network 15168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 15178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "AddNetwork" method call of a network interface. 15188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 15198d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_network(DBusMessage *message, 15208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 15218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 15228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 15238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter; 15248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid = NULL; 15258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *path = path_buf; 15261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError error; 15278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 15298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1530cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s->dbus_new_path) 1531d13095b921f259373b91480bc40fb53172ca4860Dmitry Shmidt ssid = wpa_supplicant_add_network(wpa_s); 15328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 15336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_ERROR, "%s[dbus]: can't add new interface.", 15346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 15358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_unknown_error( 15368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, 15376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "wpa_supplicant could not add a network on this interface."); 15388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 15398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_error_init(&error); 15421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!set_network_properties(wpa_s, ssid, &iter, &error)) { 15436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 15446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: control interface couldn't set network properties", 15456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 15461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_reply_new_from_error(message, &error, 15471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_ERROR_INVALID_ARGS, 15481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "Failed to add network"); 15491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_error_free(&error); 15508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 15518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Construct the object path for this network. */ 15548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX, 15558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d", 15568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, ssid->id); 15578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 15598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply == NULL) { 15606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = wpas_dbus_error_no_memory(message); 15618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 15628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path, 15648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID)) { 15658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 15666c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = wpas_dbus_error_no_memory(message); 15678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 15688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 15718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr: 15738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid) { 15748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_removed(wpa_s, ssid); 15758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_remove_network(wpa_s->conf, ssid->id); 15768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 15788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 15798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1582413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt * wpas_dbus_handler_reassociate - Reassociate 158361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * @message: Pointer to incoming dbus message 158461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 1585413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt * Returns: InterfaceDisabled DBus error message if disabled 158661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * or NULL otherwise. 158761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * 158861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * Handler function for "Reassociate" method call of network interface. 158961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt */ 159061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtDBusMessage * wpas_dbus_handler_reassociate(DBusMessage *message, 159161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt struct wpa_supplicant *wpa_s) 159261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 1593413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt if (wpa_s->wpa_state != WPA_INTERFACE_DISABLED) { 1594d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt wpas_request_connection(wpa_s); 159561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return NULL; 159661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 159761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 1598413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_IFACE_DISABLED, 1599413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt "This interface is disabled"); 160061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 160161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 160261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 160361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt/** 1604d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt * wpas_dbus_handler_expect_disconnect - ExpectDisconnect 1605d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt * @message: Pointer to incoming dbus message 1606d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt * @global: %wpa_supplicant global data structure 1607d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt * Returns: NULL 1608d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt * 1609d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt * Handler function for notifying system there will be a expected disconnect. 1610d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt * This will prevent wpa_supplicant from adding blacklists upon next disconnect.. 1611d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt */ 1612d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry ShmidtDBusMessage * wpas_dbus_handler_expect_disconnect(DBusMessage *message, 1613d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt struct wpa_global *global) 1614d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt{ 1615d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt struct wpa_supplicant *wpa_s = global->ifaces; 1616d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 1617d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt for (; wpa_s; wpa_s = wpa_s->next) 1618d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt if (wpa_s->wpa_state >= WPA_ASSOCIATED) 1619d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt wpa_s->own_disconnect_req = 1; 1620d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt return NULL; 1621d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt} 1622d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 1623d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 1624d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt/** 16259866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * wpas_dbus_handler_reattach - Reattach to current AP 16269866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * @message: Pointer to incoming dbus message 16279866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 16289866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * Returns: NotConnected DBus error message if not connected 16299866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * or NULL otherwise. 16309866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * 16319866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * Handler function for "Reattach" method call of network interface. 16329866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt */ 16339866086a955d00e237cc8df3722e7dff75c02532Dmitry ShmidtDBusMessage * wpas_dbus_handler_reattach(DBusMessage *message, 16349866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt struct wpa_supplicant *wpa_s) 16359866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt{ 16369866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt if (wpa_s->current_ssid != NULL) { 16379866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt wpa_s->reattach = 1; 16389866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt wpas_request_connection(wpa_s); 16399866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt return NULL; 16409866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt } 16419866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt 16429866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_NOT_CONNECTED, 16439866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt "This interface is not connected"); 16449866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt} 16459866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt 16469866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt 16479866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt/** 1648a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt * wpas_dbus_handler_reconnect - Reconnect if disconnected 1649a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt * @message: Pointer to incoming dbus message 1650a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 1651a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt * Returns: InterfaceDisabled DBus error message if disabled 1652a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt * or NULL otherwise. 1653a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt * 1654a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt * Handler function for "Reconnect" method call of network interface. 1655a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt */ 1656a3dc30964aa24aea2b518246f6812663a1103490Dmitry ShmidtDBusMessage * wpas_dbus_handler_reconnect(DBusMessage *message, 1657a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt struct wpa_supplicant *wpa_s) 1658a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt{ 1659a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) { 1660a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt return dbus_message_new_error(message, 1661a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt WPAS_DBUS_ERROR_IFACE_DISABLED, 1662a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt "This interface is disabled"); 1663a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt } 1664a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt 1665a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt if (wpa_s->disconnected) 1666a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt wpas_request_connection(wpa_s); 1667a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt return NULL; 1668a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt} 1669a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt 1670a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt 1671a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt/** 16728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_network - Remove a configured network 16738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 16748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 16758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure 16768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 16778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveNetwork" method call of a network interface. 16788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 16798d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_network(DBusMessage *message, 16808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 16818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 16828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 16838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *op; 16846c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt char *iface, *net_id; 16858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int id; 1686d13095b921f259373b91480bc40fb53172ca4860Dmitry Shmidt int result; 16878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op, 16898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 16908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Extract the network ID and ensure the network */ 16928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* is actually a child of this interface */ 16936c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt iface = wpas_dbus_new_decompose_object_path(op, 16946c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt WPAS_DBUS_NEW_NETWORKS_PART, 16956c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &net_id); 1696cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (iface == NULL || net_id == NULL || !wpa_s->dbus_new_path || 1697d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt os_strcmp(iface, wpa_s->dbus_new_path) != 0) { 16988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 16998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 17008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1702d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt errno = 0; 17038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt id = strtoul(net_id, NULL, 10); 1704d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (errno != 0) { 17058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 17068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 17078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1709d13095b921f259373b91480bc40fb53172ca4860Dmitry Shmidt result = wpa_supplicant_remove_network(wpa_s, id); 1710d13095b921f259373b91480bc40fb53172ca4860Dmitry Shmidt if (result == -1) { 17118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_network_unknown(message); 17128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 17138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1714d13095b921f259373b91480bc40fb53172ca4860Dmitry Shmidt if (result == -2) { 1715684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt wpa_printf(MSG_ERROR, 17166c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: error occurred when removing network %d", 17176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__, id); 1718684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt reply = wpas_dbus_error_unknown_error( 17196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 17206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "error removing the specified network on is interface."); 1721684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt goto out; 1722684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt } 17238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 17258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(iface); 17268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 17278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void remove_network(void *arg, struct wpa_ssid *ssid) 17318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = arg; 17338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_removed(wpa_s, ssid); 17358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_remove_network(wpa_s->conf, ssid->id) < 0) { 17378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, 17386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: error occurred when removing network %d", 17396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__, ssid->id); 17408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 17418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == wpa_s->current_ssid) 1744d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt wpa_supplicant_deauthenticate(wpa_s, 1745d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt WLAN_REASON_DEAUTH_LEAVING); 17468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 17508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_all_networks - Remove all configured networks 17518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 17528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 17538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure 17548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 17558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveAllNetworks" method call of a network interface. 17568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 17578d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_all_networks( 17588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *message, struct wpa_supplicant *wpa_s) 17598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17602f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt if (wpa_s->sched_scanning) 17612f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt wpa_supplicant_cancel_sched_scan(wpa_s); 17622f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 17638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* NB: could check for failure and return an error */ 17648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_foreach_network(wpa_s->conf, remove_network, wpa_s); 17658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 17668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 17708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_select_network - Attempt association with a network 17718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 17728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 17738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure 17748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 17758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "SelectNetwork" method call of network interface. 17768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 17778d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_select_network(DBusMessage *message, 17788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 17798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 17818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *op; 17826c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt char *iface, *net_id; 17838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int id; 17848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 17858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op, 17878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 17888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Extract the network ID and ensure the network */ 17908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* is actually a child of this interface */ 17916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt iface = wpas_dbus_new_decompose_object_path(op, 17926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt WPAS_DBUS_NEW_NETWORKS_PART, 17936c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &net_id); 1794cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (iface == NULL || net_id == NULL || !wpa_s->dbus_new_path || 1795d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt os_strcmp(iface, wpa_s->dbus_new_path) != 0) { 17968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 17978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 17988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1800d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt errno = 0; 18018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt id = strtoul(net_id, NULL, 10); 1802d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (errno != 0) { 18038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 18048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 18058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 18088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 18098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_network_unknown(message); 18108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 18118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Finally, associate with the network */ 18148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_select_network(wpa_s, ssid); 18158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 18178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(iface); 18188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 18198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 18208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 18231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * wpas_dbus_handler_network_reply - Reply to a NetworkRequest signal 18241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @message: Pointer to incoming dbus message 18251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 18261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: NULL on success or dbus error on failure 18271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * 18281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Handler function for "NetworkReply" method call of network interface. 18291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt */ 18301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry ShmidtDBusMessage * wpas_dbus_handler_network_reply(DBusMessage *message, 18311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s) 18321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 18331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef IEEE8021X_EAPOL 18341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessage *reply = NULL; 18351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const char *op, *field, *value; 18366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt char *iface, *net_id; 18371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int id; 18381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_ssid *ssid; 18391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 18401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_get_args(message, NULL, 18416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt DBUS_TYPE_OBJECT_PATH, &op, 18426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt DBUS_TYPE_STRING, &field, 18436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt DBUS_TYPE_STRING, &value, 18446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt DBUS_TYPE_INVALID)) 18451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_error_invalid_args(message, NULL); 18461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 18471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Extract the network ID and ensure the network */ 18481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* is actually a child of this interface */ 18496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt iface = wpas_dbus_new_decompose_object_path(op, 18506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt WPAS_DBUS_NEW_NETWORKS_PART, 18516c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &net_id); 1852cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (iface == NULL || net_id == NULL || !wpa_s->dbus_new_path || 1853d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt os_strcmp(iface, wpa_s->dbus_new_path) != 0) { 18541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 18551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto out; 18561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 18571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1858d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt errno = 0; 18591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt id = strtoul(net_id, NULL, 10); 1860d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (errno != 0) { 18611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_error_invalid_args(message, net_id); 18621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto out; 18631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 18641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 18651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 18661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (ssid == NULL) { 18671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_error_network_unknown(message); 18681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto out; 18691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 18701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 18711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (wpa_supplicant_ctrl_iface_ctrl_rsp_handle(wpa_s, ssid, 18721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt field, value) < 0) 18731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_error_invalid_args(message, field); 18741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt else { 18751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Tell EAP to retry immediately */ 18761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt eapol_sm_notify_ctrl_response(wpa_s->eapol); 18771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 18781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 18791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtout: 18801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(iface); 18811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return reply; 18821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#else /* IEEE8021X_EAPOL */ 1883b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt wpa_printf(MSG_DEBUG, "dbus: 802.1X not included"); 18841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_error_unknown_error(message, "802.1X not included"); 18851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* IEEE8021X_EAPOL */ 18861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 18871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 18881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1889700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_BLOBS 1890700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt 18911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/** 18928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_add_blob - Store named binary blob (ie, for certificates) 18938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 18948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 18958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing an error on failure or NULL on success 18968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 18978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally store a binary blobs. 18988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 18998d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_blob(DBusMessage *message, 19008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 19018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 19028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 19038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, array_iter; 19048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *blob_name; 19068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *blob_data; 19078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int blob_len; 19088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_config_blob *blob = NULL; 19098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 19118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&iter, &blob_name); 19128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_get_blob(wpa_s->conf, blob_name)) { 19148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, 19158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPAS_DBUS_ERROR_BLOB_EXISTS, 19168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 19178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&iter); 19208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&iter, &array_iter); 19218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_fixed_array(&array_iter, &blob_data, &blob_len); 19238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = os_zalloc(sizeof(*blob)); 19258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!blob) { 19266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = wpas_dbus_error_no_memory(message); 19278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 19288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->data = os_malloc(blob_len); 19316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt blob->name = os_strdup(blob_name); 19326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!blob->data || !blob->name) { 19336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = wpas_dbus_error_no_memory(message); 19348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 19358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(blob->data, blob_data, blob_len); 19378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->len = blob_len; 19388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_set_blob(wpa_s->conf, blob); 19408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_blob_added(wpa_s, blob->name); 19418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 19438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr: 19458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (blob) { 19468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(blob->name); 19478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(blob->data); 19488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(blob); 19498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 19518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 19528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 19558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_blob - Get named binary blob (ie, for certificates) 19568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 19578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 19588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing array of bytes (blob) 19598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 19608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Gets one wpa_supplicant's binary blobs. 19618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 19628d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_blob(DBusMessage *message, 19638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 19648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 19658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 19668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, array_iter; 19678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *blob_name; 19698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct wpa_config_blob *blob; 19708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name, 19728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 19738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = wpa_config_get_blob(wpa_s->conf, blob_name); 19758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!blob) { 19768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, 19778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPAS_DBUS_ERROR_BLOB_UNKNOWN, 19788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Blob id not set"); 19798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 19826c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!reply) 19836c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpas_dbus_error_no_memory(message); 19848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init_append(reply, &iter); 19868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, 19888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_BYTE_AS_STRING, 19896c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &array_iter) || 19906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_append_fixed_array(&array_iter, DBUS_TYPE_BYTE, 19916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &(blob->data), blob->len) || 19926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(&iter, &array_iter)) { 19938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 19946c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = wpas_dbus_error_no_memory(message); 19958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 19988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 19998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 20028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_remove_handler_remove_blob - Remove named binary blob 20038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 20048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 20058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error 20068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 20078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally remove a binary blobs. 20088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 20098d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_blob(DBusMessage *message, 20108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 20118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 20128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 20138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *blob_name; 20148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name, 20168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 20178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_remove_blob(wpa_s->conf, blob_name)) { 20198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, 20208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPAS_DBUS_ERROR_BLOB_UNKNOWN, 20218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Blob id not set"); 20228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_blob_removed(wpa_s, blob_name); 20248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 20268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 20288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2029700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_BLOBS */ 2030700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt 2031700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt 20328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 20338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_flush_bss - Flush the BSS cache 20348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 20358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 20368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL 20378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 20388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "FlushBSS" method call of network interface. 20398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 20408d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_flush_bss(DBusMessage *message, 20418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 20428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 20438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t age; 20448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_UINT32, &age, 20468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 20478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (age == 0) 20498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_bss_flush(wpa_s); 20508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 20518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_bss_flush_by_age(wpa_s, age); 20528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 20548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 20558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 205704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN 205804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 205904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_handler_autoscan - Set autoscan parameters for the interface 206004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @message: Pointer to incoming dbus message 206104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 206204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: NULL 206304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 206404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Handler function for "AutoScan" method call of network interface. 206504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 206604949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_autoscan(DBusMessage *message, 206704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_supplicant *wpa_s) 206804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 206904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessage *reply = NULL; 207004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt enum wpa_states state = wpa_s->wpa_state; 207104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *arg; 207204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 207304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &arg, 207404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBUS_TYPE_INVALID); 207504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 207604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (arg != NULL && os_strlen(arg) > 0) { 207704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *tmp; 20786c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 207904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt tmp = os_strdup(arg); 208004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (tmp == NULL) { 20816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = wpas_dbus_error_no_memory(message); 208204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else { 208304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(wpa_s->conf->autoscan); 208404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->conf->autoscan = tmp; 208504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (state == WPA_DISCONNECTED || state == WPA_INACTIVE) 208604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt autoscan_init(wpa_s, 1); 208704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt else if (state == WPA_SCANNING) 208804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_supplicant_reinit_autoscan(wpa_s); 208904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 209004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (arg != NULL && os_strlen(arg) == 0) { 209104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(wpa_s->conf->autoscan); 209204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->conf->autoscan = NULL; 209304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt autoscan_deinit(wpa_s); 209404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else 209504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt reply = dbus_message_new_error(message, 209604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBUS_ERROR_INVALID_ARGS, 209704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt NULL); 209804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 209904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return reply; 210004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 210104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */ 210204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 210304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 21048da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt/* 21058da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * wpas_dbus_handler_eap_logoff - IEEE 802.1X EAPOL state machine logoff 21068da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @message: Pointer to incoming dbus message 21078da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 21088da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Returns: NULL 21098da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * 21108da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Handler function for "EAPLogoff" method call of network interface. 21118da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt */ 21128da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry ShmidtDBusMessage * wpas_dbus_handler_eap_logoff(DBusMessage *message, 21138da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt struct wpa_supplicant *wpa_s) 21148da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt{ 21158da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt eapol_sm_notify_logoff(wpa_s->eapol, TRUE); 21168da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt return NULL; 21178da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt} 21188da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt 21198da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt 21208da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt/* 21218da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * wpas_dbus_handler_eap_logon - IEEE 802.1X EAPOL state machine logon 21228da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @message: Pointer to incoming dbus message 21238da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 21248da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Returns: NULL 21258da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * 21268da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Handler function for "EAPLogin" method call of network interface. 21278da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt */ 21288da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry ShmidtDBusMessage * wpas_dbus_handler_eap_logon(DBusMessage *message, 21298da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt struct wpa_supplicant *wpa_s) 21308da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt{ 21318da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt eapol_sm_notify_logoff(wpa_s->eapol, FALSE); 21328da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt return NULL; 21338da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt} 21348da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt 21358da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt 2136e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt#ifdef CONFIG_TDLS 2137e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 21387d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidtstatic int get_peer_hwaddr_helper(DBusMessage *message, const char *func_name, 21397d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt u8 *peer_address, DBusMessage **error) 2140e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 2141e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt const char *peer_string; 2142e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 21437d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt *error = NULL; 21447d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt 2145e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (!dbus_message_get_args(message, NULL, 2146e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt DBUS_TYPE_STRING, &peer_string, 21477d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt DBUS_TYPE_INVALID)) { 21487d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt *error = wpas_dbus_error_invalid_args(message, NULL); 21497d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt return -1; 21507d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt } 2151e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2152e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (hwaddr_aton(peer_string, peer_address)) { 2153e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: invalid address '%s'", 2154e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt func_name, peer_string); 21557d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt *error = wpas_dbus_error_invalid_args( 2156e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt message, "Invalid hardware address format"); 21577d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt return -1; 2158e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt } 2159e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 21607d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt return 0; 2161e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 2162e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2163e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2164e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/* 2165e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_discover - Discover TDLS peer 2166e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message 2167e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 2168e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure 2169e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * 2170e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSDiscover" method call of network interface. 2171e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */ 2172e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_discover(DBusMessage *message, 2173e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt struct wpa_supplicant *wpa_s) 2174e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 2175e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt u8 peer[ETH_ALEN]; 2176e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt DBusMessage *error_reply; 2177e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt int ret; 2178e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 21797d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0) 2180e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return error_reply; 2181e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2182e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_printf(MSG_DEBUG, "DBUS TDLS_DISCOVER " MACSTR, MAC2STR(peer)); 2183e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2184e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (wpa_tdls_is_external_setup(wpa_s->wpa)) 2185e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_tdls_send_discovery_request(wpa_s->wpa, peer); 2186e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt else 2187e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_drv_tdls_oper(wpa_s, TDLS_DISCOVERY_REQ, peer); 2188e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2189e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (ret) { 2190e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return wpas_dbus_error_unknown_error( 2191e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt message, "error performing TDLS discovery"); 2192e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt } 2193e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2194e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return NULL; 2195e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 2196e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2197e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2198e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/* 2199e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_setup - Setup TDLS session 2200e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message 2201e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 2202e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure 2203e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * 2204e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSSetup" method call of network interface. 2205e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */ 2206e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_setup(DBusMessage *message, 2207e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt struct wpa_supplicant *wpa_s) 2208e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 2209e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt u8 peer[ETH_ALEN]; 2210e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt DBusMessage *error_reply; 2211e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt int ret; 2212e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 22137d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0) 2214e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return error_reply; 2215e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2216e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_printf(MSG_DEBUG, "DBUS TDLS_SETUP " MACSTR, MAC2STR(peer)); 2217e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2218e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_tdls_remove(wpa_s->wpa, peer); 2219e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (wpa_tdls_is_external_setup(wpa_s->wpa)) 2220e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_tdls_start(wpa_s->wpa, peer); 2221e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt else 2222e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_drv_tdls_oper(wpa_s, TDLS_SETUP, peer); 2223e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2224e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (ret) { 2225e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return wpas_dbus_error_unknown_error( 2226e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt message, "error performing TDLS setup"); 2227e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt } 2228e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2229e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return NULL; 2230e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 2231e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2232e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2233e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/* 2234e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_status - Return TDLS session status 2235e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message 2236e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 2237e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: A string representing the state of the link to this TDLS peer 2238e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * 2239e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSStatus" method call of network interface. 2240e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */ 2241e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_status(DBusMessage *message, 2242e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt struct wpa_supplicant *wpa_s) 2243e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 2244e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt u8 peer[ETH_ALEN]; 2245e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt DBusMessage *reply; 2246e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt const char *tdls_status; 2247e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 22487d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt if (get_peer_hwaddr_helper(message, __func__, peer, &reply) < 0) 2249e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return reply; 2250e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2251e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_printf(MSG_DEBUG, "DBUS TDLS_STATUS " MACSTR, MAC2STR(peer)); 2252e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2253e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt tdls_status = wpa_tdls_get_link_status(wpa_s->wpa, peer); 2254e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2255e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt reply = dbus_message_new_method_return(message); 2256e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt dbus_message_append_args(reply, DBUS_TYPE_STRING, 2257e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt &tdls_status, DBUS_TYPE_INVALID); 2258e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return reply; 2259e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 2260e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2261e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2262e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/* 2263e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_teardown - Teardown TDLS session 2264e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message 2265e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 2266e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure 2267e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * 2268e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSTeardown" method call of network interface. 2269e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */ 2270e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_teardown(DBusMessage *message, 2271e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt struct wpa_supplicant *wpa_s) 2272e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 2273e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt u8 peer[ETH_ALEN]; 2274e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt DBusMessage *error_reply; 2275e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt int ret; 2276e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 22777d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0) 2278e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return error_reply; 2279e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2280e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_printf(MSG_DEBUG, "DBUS TDLS_TEARDOWN " MACSTR, MAC2STR(peer)); 2281e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2282e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (wpa_tdls_is_external_setup(wpa_s->wpa)) 2283e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_tdls_teardown_link( 2284e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_s->wpa, peer, 2285e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED); 2286e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt else 2287e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_drv_tdls_oper(wpa_s, TDLS_TEARDOWN, peer); 2288e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2289e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (ret) { 2290e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return wpas_dbus_error_unknown_error( 2291e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt message, "error performing TDLS teardown"); 2292e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt } 2293e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2294e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return NULL; 2295e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 2296e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2297e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt#endif /* CONFIG_TDLS */ 2298e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2299e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2300b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_WRITE 2301b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt/** 2302b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt * wpas_dbus_handler_save_config - Save configuration to configuration file 2303b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt * @message: Pointer to incoming dbus message 2304b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 2305b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt * Returns: NULL on Success, Otherwise errror message 2306b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt * 2307b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt * Handler function for "SaveConfig" method call of network interface. 2308b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt */ 2309b70d0bbd90f638aa38da542e337c312309200e87Dmitry ShmidtDBusMessage * wpas_dbus_handler_save_config(DBusMessage *message, 2310b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt struct wpa_supplicant *wpa_s) 2311b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt{ 2312b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt int ret; 2313b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt 2314b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt if (!wpa_s->conf->update_config) { 2315b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt return wpas_dbus_error_unknown_error( 2316b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt message, 2317b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt "Not allowed to update configuration (update_config=0)"); 2318b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt } 2319b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt 2320b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt ret = wpa_config_write(wpa_s->confname, wpa_s->conf); 2321b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt if (ret) 2322b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt return wpas_dbus_error_unknown_error( 2323b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt message, "Failed to update configuration"); 2324b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt return NULL; 2325b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt} 2326b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_WRITE */ 2327b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt 2328b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt 23298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 233001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_handler_set_pkcs11_engine_and_module_path - Set PKCS #11 engine and module path 233101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @message: Pointer to incoming dbus message 233201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 233301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing an error on failure or NULL on success 233401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * 233501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Sets the PKCS #11 engine and module path. 233601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */ 233701904cfafd75a70b9f29c0220b90bdef45595491Dmitry ShmidtDBusMessage * wpas_dbus_handler_set_pkcs11_engine_and_module_path( 233801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt DBusMessage *message, struct wpa_supplicant *wpa_s) 233901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{ 234001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt DBusMessageIter iter; 234101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt char *value = NULL; 234201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt char *pkcs11_engine_path = NULL; 234301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt char *pkcs11_module_path = NULL; 234401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 234501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt dbus_message_iter_init(message, &iter); 234601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt dbus_message_iter_get_basic(&iter, &value); 234701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (value == NULL) { 234801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return dbus_message_new_error( 234901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt message, DBUS_ERROR_INVALID_ARGS, 235001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt "Invalid pkcs11_engine_path argument"); 235101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt } 235201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt /* Empty path defaults to NULL */ 235301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (os_strlen(value)) 235401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_engine_path = value; 235501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 235601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt dbus_message_iter_next(&iter); 235701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt dbus_message_iter_get_basic(&iter, &value); 235801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (value == NULL) { 235901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt os_free(pkcs11_engine_path); 236001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return dbus_message_new_error( 236101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt message, DBUS_ERROR_INVALID_ARGS, 236201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt "Invalid pkcs11_module_path argument"); 236301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt } 236401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt /* Empty path defaults to NULL */ 236501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (os_strlen(value)) 236601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_module_path = value; 236701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 236801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (wpas_set_pkcs11_engine_and_module_path(wpa_s, pkcs11_engine_path, 236901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_module_path)) 237001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return dbus_message_new_error( 237101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt message, DBUS_ERROR_FAILED, 23726c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Reinit of the EAPOL state machine with the new PKCS #11 engine and module path failed."); 237301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 2374cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s->dbus_new_path) { 2375cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt wpa_dbus_mark_property_changed( 2376cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt wpa_s->global->dbus, wpa_s->dbus_new_path, 2377cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11EnginePath"); 2378cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt wpa_dbus_mark_property_changed( 2379cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt wpa_s->global->dbus, wpa_s->dbus_new_path, 2380cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11ModulePath"); 2381cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } 238201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 238301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return NULL; 238401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt} 238501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 238601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 238701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/** 23888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_capabilities - Return interface capabilities 23891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 23901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 23911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 23921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 23938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 23948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Capabilities" property of an interface. 23958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 2396d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_capabilities( 2397d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 2398d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 23998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 24001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 24018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_capa capa; 24028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 24031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter iter_dict, iter_dict_entry, iter_dict_val, iter_array, 24048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt variant_iter; 24058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *scans[] = { "active", "passive", "ssid" }; 24068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 24086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "a{sv}", &variant_iter) || 24096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_open_write(&variant_iter, &iter_dict)) 24108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = wpa_drv_get_capa(wpa_s, &capa); 24138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** pairwise cipher */ 24158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 24168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = {"ccmp", "tkip", "none"}; 24176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 24188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 24198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "Pairwise", args, 242068d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(args))) 24218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 24238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Pairwise", 24248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 24258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 24266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array) || 24276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP_256) && 24286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24296c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "ccmp-256")) || 24306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP_256) && 24316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "gcmp-256")) || 24336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) && 24346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "ccmp")) || 24366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP) && 24376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "gcmp")) || 24396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) && 24406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "tkip")) || 24426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) && 24436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "none")) || 24456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_end_string_array(&iter_dict, 24468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 24478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 24488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 24498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** group cipher */ 24538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 24548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { 24558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "ccmp", "tkip", "wep104", "wep40" 24568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }; 24576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 24588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 24598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "Group", args, 246068d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(args))) 24618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 24638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Group", 24648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 24658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 24666c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array) || 24676c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP_256) && 24686c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "ccmp-256")) || 24706c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP_256) && 24716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24726c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "gcmp-256")) || 24736c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) && 24746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "ccmp")) || 24766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP) && 24776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24786c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "gcmp")) || 24796c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) && 24806c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "tkip")) || 24826c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_WEP104) && 24836c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24846c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "wep104")) || 24856c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_WEP40) && 24866c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24876c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "wep40")) || 24886c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_end_string_array(&iter_dict, 24898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 24908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 24918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 24928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2495092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart if (!wpa_dbus_dict_begin_string_array(&iter_dict, "GroupMgmt", 2496092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart &iter_dict_entry, 2497092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart &iter_dict_val, 2498092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart &iter_array) || 2499092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart (res == 0 && (capa.enc & WPA_DRIVER_CAPA_ENC_BIP) && 2500092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart !wpa_dbus_dict_string_array_add_element( 2501092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart &iter_array, "aes-128-cmac")) || 2502092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart (res == 0 && (capa.enc & WPA_DRIVER_CAPA_ENC_BIP_GMAC_128) && 2503092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart !wpa_dbus_dict_string_array_add_element( 2504092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart &iter_array, "bip-gmac-128")) || 2505092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart (res == 0 && (capa.enc & WPA_DRIVER_CAPA_ENC_BIP_GMAC_256) && 2506092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart !wpa_dbus_dict_string_array_add_element( 2507092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart &iter_array, "bip-gmac-256")) || 2508092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart (res == 0 && (capa.enc & WPA_DRIVER_CAPA_ENC_BIP_CMAC_256) && 2509092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart !wpa_dbus_dict_string_array_add_element( 2510092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart &iter_array, "bip-cmac-256")) || 2511092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart !wpa_dbus_dict_end_string_array(&iter_dict, 2512092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart &iter_dict_entry, 2513092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart &iter_dict_val, 2514092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart &iter_array)) 2515092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart goto nomem; 2516092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart 25178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** key management */ 25188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 25198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { 25208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa-psk", "wpa-eap", "ieee8021x", "wpa-none", 25218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 25228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wps", 25238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 25248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "none" 25258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }; 25268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 25278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "KeyMgmt", args, 252868d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(args))) 25298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 25318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "KeyMgmt", 25328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 25338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 25346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array) || 25356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element(&iter_array, 25366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "none") || 25376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element(&iter_array, 25388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "ieee8021x")) 25398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA | 25428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2)) { 25438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 25446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "wpa-eap") || 25456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_FT) && 25466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 25476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "wpa-ft-eap"))) 25488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */ 25518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 25528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 25538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-eap-sha256")) 25548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 25568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK | 25598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) { 25608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 25616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "wpa-psk") || 25626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.key_mgmt & 25636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_FT_PSK) && 25646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 25656c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "wpa-ft-psk"))) 25668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */ 25698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 25708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 25718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-psk-sha256")) 25728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 25748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if ((capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) && 25776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element(&iter_array, 25786c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "wpa-none")) 25796c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt goto nomem; 25808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 25838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element(&iter_array, 25848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wps")) 25858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 25878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_end_string_array(&iter_dict, 25898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 25908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 25918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 25928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** WPA protocol */ 25968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 25978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { "rsn", "wpa" }; 25986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 25998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 26008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "Protocol", args, 260168d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(args))) 26028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 26038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 26048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Protocol", 26058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 26068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 26076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array) || 26086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA2 | 26096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) && 26106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 26116c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "rsn")) || 26126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA | 26136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK)) && 26146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 26156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "wpa")) || 26166c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_end_string_array(&iter_dict, 26178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 26188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 26198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 26208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 26218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** auth alg */ 26248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 26258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { "open", "shared", "leap" }; 26266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 26278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 26288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "AuthAlg", args, 262968d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(args))) 26308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 26318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 26328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "AuthAlg", 26338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 26348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 26358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 26368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 26378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (((capa.auth & WPA_DRIVER_AUTH_OPEN) && 26396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 26406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "open")) || 26416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.auth & WPA_DRIVER_AUTH_SHARED) && 26426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 26436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "shared")) || 26446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.auth & WPA_DRIVER_AUTH_LEAP) && 26456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 26466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "leap")) || 26476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_end_string_array(&iter_dict, 26488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 26498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 26508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 26518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 26528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** Scan */ 26558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array(&iter_dict, "Scan", scans, 265668d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(scans))) 26578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 26588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** Modes */ 266075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Modes", 266175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_entry, 266275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_val, 26636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array) || 26646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 26656c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "infrastructure") || 2666849734c8d1847920ed7042463f7480b1e0c1dfeaDmitry Shmidt (res >= 0 && (capa.flags & WPA_DRIVER_FLAGS_IBSS) && 2667849734c8d1847920ed7042463f7480b1e0c1dfeaDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 2668849734c8d1847920ed7042463f7480b1e0c1dfeaDmitry Shmidt &iter_array, "ad-hoc")) || 26696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (res >= 0 && (capa.flags & WPA_DRIVER_FLAGS_AP) && 26706c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 26716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "ap")) || 26726c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (res >= 0 && (capa.flags & WPA_DRIVER_FLAGS_P2P_CAPABLE) && 2673b97e428f8acf1ecb93f38f8d0063d2f2fd0bc36eDmitry Shmidt !wpa_s->conf->p2p_disabled && 26746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 26756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "p2p")) || 26766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_end_string_array(&iter_dict, 267775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_entry, 267875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_val, 267975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_array)) 268075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen goto nomem; 268175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen /***** Modes end */ 268275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen 26831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (res >= 0) { 26841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_int32_t max_scan_ssid = capa.max_scan_ssids; 26851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 26861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpa_dbus_dict_append_int32(&iter_dict, "MaxScanSSID", 26871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt max_scan_ssid)) 26881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto nomem; 26891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 26901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 26916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict) || 26926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) 26938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 26948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 26968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem: 26981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 26991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 27008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 27048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_state - Get interface state 27051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 27061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 27071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 27081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 27098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 27108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "State" property. 27118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 2712d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_state( 2713d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 2714d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 27158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 27161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 27178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *str_state; 27188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *state_ls, *tmp; 27191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 27208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt str_state = wpa_supplicant_state_txt(wpa_s->wpa_state); 27228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* make state string lowercase to fit new DBus API convention 27248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 27258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt state_ls = tmp = os_strdup(str_state); 27268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!tmp) { 27271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 27281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 27298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 27308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*tmp) { 27318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *tmp = tolower(*tmp); 27328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tmp++; 27338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 27348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 27361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &state_ls, error); 27378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(state_ls); 27398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 27418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 27458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_get_scanning - Get interface scanning state 27461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 27471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 27481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 27491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 27508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 27518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "scanning" property. 27528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 2753d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_scanning( 2754d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 2755d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 27568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 27571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 27588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t scanning = wpa_s->scanning ? TRUE : FALSE; 27591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 27601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 27611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &scanning, error); 27628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 27668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ap_scan - Control roaming mode 27671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 27681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 27691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 27701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 27718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 27728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "ApScan" property. 27738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 2774d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_ap_scan( 2775d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 2776d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 27778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 27781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 27798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t ap_scan = wpa_s->conf->ap_scan; 27801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 27811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, 27821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &ap_scan, error); 27838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 27878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_ap_scan - Control roaming mode 27881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 27891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 27901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 27911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 27928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 27938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "ApScan" property. 27948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 2795d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_ap_scan( 2796d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 2797d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 27988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 27991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 28008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t ap_scan; 28018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32, 28031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &ap_scan)) 28041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 28058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_set_ap_scan(wpa_s, ap_scan)) { 28071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 28081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "ap_scan must be 0, 1, or 2"); 28091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 28108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 28111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 28128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 28138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2815092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart#ifdef CONFIG_IEEE80211W 2816092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart 2817092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart/** 2818092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart * wpas_dbus_getter_pmf - Control PMF default 2819092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart * @iter: Pointer to incoming dbus message iter 2820092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart * @error: Location to store error on failure 2821092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart * @user_data: Function specific data 2822092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart * Returns: TRUE on success, FALSE on failure 2823092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart * 2824092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart * Getter function for "Pmf" property. 2825092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart */ 2826092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewartdbus_bool_t wpas_dbus_getter_pmf( 2827092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart const struct wpa_dbus_property_desc *property_desc, 2828092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart DBusMessageIter *iter, DBusError *error, void *user_data) 2829092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart{ 2830092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart struct wpa_supplicant *wpa_s = user_data; 2831092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart dbus_uint32_t pmf = wpa_s->conf->pmf; 2832092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart 2833092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, 2834092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart &pmf, error); 2835092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart} 2836092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart 2837092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart 2838092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart/** 2839092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart * wpas_dbus_setter_pmf - Control PMF default 2840092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart * @iter: Pointer to incoming dbus message iter 2841092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart * @error: Location to store error on failure 2842092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart * @user_data: Function specific data 2843092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart * Returns: TRUE on success, FALSE on failure 2844092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart * 2845092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart * Setter function for "Pmf" property. 2846092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart */ 2847092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewartdbus_bool_t wpas_dbus_setter_pmf( 2848092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart const struct wpa_dbus_property_desc *property_desc, 2849092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart DBusMessageIter *iter, DBusError *error, void *user_data) 2850092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart{ 2851092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart struct wpa_supplicant *wpa_s = user_data; 2852092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart dbus_uint32_t pmf; 2853092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart 2854092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32, 2855092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart &pmf)) 2856092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart return FALSE; 2857092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart 2858092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart if (pmf > 2) { 2859092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart dbus_set_error_const(error, DBUS_ERROR_FAILED, 2860092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart "Pmf must be 0, 1, or 2"); 2861092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart return FALSE; 2862092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart } 2863092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart wpa_s->conf->pmf = pmf; 2864092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart return TRUE; 2865092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart} 2866092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart 2867092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart#endif /* CONFIG_IEEE80211W */ 2868092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart 2869092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart 28708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 2871c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * wpas_dbus_getter_fast_reauth - Control fast 2872c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * reauthentication (TLS session resumption) 2873c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 2874c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @error: Location to store error on failure 2875c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @user_data: Function specific data 2876c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Returns: TRUE on success, FALSE on failure 2877c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * 2878c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Getter function for "FastReauth" property. 2879c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt */ 2880d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_fast_reauth( 2881d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 2882d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 2883c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt{ 2884c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 2885c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt dbus_bool_t fast_reauth = wpa_s->conf->fast_reauth ? TRUE : FALSE; 2886c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2887c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 2888c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt &fast_reauth, error); 2889c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt} 2890c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2891c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2892c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt/** 2893c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * wpas_dbus_setter_fast_reauth - Control fast 2894c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * reauthentication (TLS session resumption) 2895c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 2896c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @error: Location to store error on failure 2897c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @user_data: Function specific data 2898c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Returns: TRUE on success, FALSE on failure 2899c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * 2900c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Setter function for "FastReauth" property. 2901c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt */ 2902d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_fast_reauth( 2903d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 2904d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 2905c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt{ 2906c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 2907c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt dbus_bool_t fast_reauth; 2908c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2909c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, 2910c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt &fast_reauth)) 2911c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return FALSE; 2912c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2913c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt wpa_s->conf->fast_reauth = fast_reauth; 2914c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return TRUE; 2915c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt} 2916c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2917c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2918c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt/** 291904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_getter_disconnect_reason - Get most recent reason for disconnect 292004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 292104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure 292204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data 292304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 292404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 292504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Getter for "DisconnectReason" property. The reason is negative if it is 292604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * locally generated. 292704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 2928d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_disconnect_reason( 2929d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 2930d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 293104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 293204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 293304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_int32_t reason = wpa_s->disconnect_reason; 29346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 293504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32, 293604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt &reason, error); 293704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 293804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 293904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 294004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 294131a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt * wpas_dbus_getter_assoc_status_code - Get most recent failed assoc status code 294231a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 294331a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt * @error: Location to store error on failure 294431a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt * @user_data: Function specific data 294531a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt * Returns: TRUE on success, FALSE on failure 294631a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt * 294731a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt * Getter for "AssocStatusCode" property. 294831a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt */ 294931a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidtdbus_bool_t wpas_dbus_getter_assoc_status_code( 295031a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 295131a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 295231a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt{ 295331a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 295431a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt dbus_int32_t status_code = wpa_s->assoc_status_code; 295531a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt 295631a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32, 295731a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt &status_code, error); 295831a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt} 295931a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt 296031a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt 296131a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt/** 29628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_age - Get BSS entry expiration age 29631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 29641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 29651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 29661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 29678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 29688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "BSSExpireAge" property. 29698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 2970d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_expire_age( 2971d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 2972d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 29738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 29741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 29758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t expire_age = wpa_s->conf->bss_expiration_age; 29761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 29771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, 29781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &expire_age, error); 29798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 29808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 29838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_age - Control BSS entry expiration age 29841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 29851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 29861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 29871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 29888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 29898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "BSSExpireAge" property. 29908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 2991d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_bss_expire_age( 2992d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 2993d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 29948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 29951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 29968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t expire_age; 29978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32, 29991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &expire_age)) 30001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 30018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_set_bss_expiration_age(wpa_s, expire_age)) { 30031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 30041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "BSSExpireAge must be >= 10"); 30051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 30068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 30071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 30088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 30128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_count - Get BSS entry expiration scan count 30131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 30141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 30151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 30161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 30178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 30188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "BSSExpireCount" property. 30198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3020d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_expire_count( 3021d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 3022d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 30238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 302561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt dbus_uint32_t expire_count = wpa_s->conf->bss_expiration_scan_count; 30261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 30271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, 30281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &expire_count, error); 30298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 30338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_count - Control BSS entry expiration scan count 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 * Setter function for "BSSExpireCount" property. 30408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3041d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_bss_expire_count( 3042d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 3043d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 30448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 30468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t expire_count; 30478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32, 30491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &expire_count)) 30501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 30518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_set_bss_expiration_count(wpa_s, expire_count)) { 30531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 30541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "BSSExpireCount must be > 0"); 30551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 30568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 30571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 30588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 30628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_country - Control country code 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 function for "Country" property. 30698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3070d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_country( 3071d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 3072d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 30738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 30758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char country[3]; 30768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *str = country; 30778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt country[0] = wpa_s->conf->country[0]; 30798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt country[1] = wpa_s->conf->country[1]; 30808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt country[2] = '\0'; 30818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 30831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &str, error); 30848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 30888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_country - Control country code 30891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 30901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 30911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 30921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 30938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 30948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "Country" property. 30958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3096d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_country( 3097d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 3098d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 30998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 31018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *country; 31028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING, 31041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &country)) 31051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 31068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!country[0] || !country[1]) { 31081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 31091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "invalid country code"); 31101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 31111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 31128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->drv_priv != NULL && wpa_drv_set_country(wpa_s, country)) { 31148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "Failed to set country"); 31151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 31161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "failed to set country code"); 31171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 31188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 31198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->conf->country[0] = country[0]; 31218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->conf->country[1] = country[1]; 31221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 31238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 312704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_getter_scan_interval - Get scan interval 312804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 312904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure 313004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data 313104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 313204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 313304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Getter function for "ScanInterval" property. 313404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 3135d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_scan_interval( 3136d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 3137d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 313804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 313904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 314004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_int32_t scan_interval = wpa_s->scan_interval; 314104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 314204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32, 314304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt &scan_interval, error); 314404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 314504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 314604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 314704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 314804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_setter_scan_interval - Control scan interval 314904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 315004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure 315104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data 315204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 315304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 315404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Setter function for "ScanInterval" property. 315504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 3156d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_scan_interval( 3157d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 3158d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 315904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 316004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 316104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_int32_t scan_interval; 316204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 316304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_INT32, 316404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt &scan_interval)) 316504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 316604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 316704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_supplicant_set_scan_interval(wpa_s, scan_interval)) { 316804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 316904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "scan_interval must be >= 0"); 317004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 317104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 317204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return TRUE; 317304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 317404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 317504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 317604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 31778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ifname - Get interface name 31781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 31791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 31801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 31811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 31828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 31838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Ifname" property. 31848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3185d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_ifname( 3186d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 3187d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 31888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 31901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3191293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt return wpas_dbus_string_property_getter(iter, wpa_s->ifname, error); 31928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 31968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_driver - Get interface name 31971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 31981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 31991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 32001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 32018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 32028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Driver" property. 32038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3204d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_driver( 3205d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 3206d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 32078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 32081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 32098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->driver == NULL || wpa_s->driver->name == NULL) { 32116c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s[dbus]: wpa_s has no driver set", 32126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 32131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, "%s: no driver set", 32141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt __func__); 32151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 32168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 32178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3218293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt return wpas_dbus_string_property_getter(iter, wpa_s->driver->name, 3219293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt error); 32208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 32218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 32248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_bss - Get current bss object path 32251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 32261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 32271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 32281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 32298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 32308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentBSS" property. 32318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3232d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_current_bss( 3233d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 3234d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 32358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 32361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 32378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *bss_obj_path = path_buf; 32388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3239cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s->current_bss && wpa_s->dbus_new_path) 32408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, 32418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u", 32428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, wpa_s->current_bss->id); 32438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 32448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/"); 32458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_OBJECT_PATH, 32471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &bss_obj_path, error); 32488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 32498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 32528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_network - Get current network object path 32531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 32541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 32551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 32561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 32578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 32588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentNetwork" property. 32598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3260d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_current_network( 3261d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 3262d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 32638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 32641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 32658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *net_obj_path = path_buf; 32668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3267cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s->current_ssid && wpa_s->dbus_new_path) 32688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, 32698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u", 32708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, wpa_s->current_ssid->id); 32718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 32728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/"); 32738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_OBJECT_PATH, 32751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &net_obj_path, error); 32768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 32778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 32808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_auth_mode - Get current authentication type 32811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 32821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 32831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 32841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 32858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 32868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentAuthMode" property. 32878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3288d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_current_auth_mode( 3289d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 3290d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 32918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 32921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 32938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *eap_mode; 32948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *auth_mode; 32958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char eap_mode_buf[WPAS_DBUS_AUTH_MODE_MAX]; 32968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->wpa_state != WPA_COMPLETED) { 32988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt auth_mode = "INACTIVE"; 32998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X || 33008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) { 33018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eap_mode = wpa_supplicant_get_eap_mode(wpa_s); 33028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(eap_mode_buf, WPAS_DBUS_AUTH_MODE_MAX, 33038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "EAP-%s", eap_mode); 33048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt auth_mode = eap_mode_buf; 33058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33064ae50e65ef0eefe6d5c356acbc1839f8eac68af5Dmitry Shmidt } else if (wpa_s->current_ssid) { 33078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt auth_mode = wpa_key_mgmt_txt(wpa_s->key_mgmt, 33088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->current_ssid->proto); 33094ae50e65ef0eefe6d5c356acbc1839f8eac68af5Dmitry Shmidt } else { 33104ae50e65ef0eefe6d5c356acbc1839f8eac68af5Dmitry Shmidt auth_mode = "UNKNOWN"; 33118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 33141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &auth_mode, error); 33158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 33168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 33198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bridge_ifname - Get interface name 33201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 33211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 33221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 33231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 33248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 33258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BridgeIfname" property. 33268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3327d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bridge_ifname( 3328d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 3329d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 33308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 33311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 33326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 3333293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt return wpas_dbus_string_property_getter(iter, wpa_s->bridge_ifname, 3334293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt error); 33358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 33368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 33397d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt * wpas_dbus_getter_config_file - Get interface configuration file path 33407d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 33417d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt * @error: Location to store error on failure 33427d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt * @user_data: Function specific data 33437d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt * Returns: TRUE on success, FALSE on failure 33447d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt * 33457d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt * Getter for "ConfigFile" property. 33467d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt */ 33477d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidtdbus_bool_t wpas_dbus_getter_config_file( 33487d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 33497d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 33507d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt{ 33517d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 33527d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt 3353293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt return wpas_dbus_string_property_getter(iter, wpa_s->confname, error); 33547d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt} 33557d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt 33567d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt 33577d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt/** 33588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bsss - Get array of BSSs objects 33591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 33601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 33611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 33621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 33638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 33648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSs" property. 33658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3366d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bsss( 3367d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 3368d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 33698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 33701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 33718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_bss *bss; 33728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **paths; 33738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int i = 0; 33741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 33758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3376cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (!wpa_s->dbus_new_path) { 3377cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3378cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt "%s: no D-Bus interface", __func__); 3379cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt return FALSE; 3380cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } 3381cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt 338261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt paths = os_calloc(wpa_s->num_bss, sizeof(char *)); 33838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!paths) { 33841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 33851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 33868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Loop through scan results and append each result's object path */ 33898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dl_list_for_each(bss, &wpa_s->bss_id, struct wpa_bss, list_id) { 33908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX); 33918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (paths[i] == NULL) { 33921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, 33931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "no memory"); 33948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 33958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Construct the object path for this BSS. */ 33978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX, 33988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u", 33998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, bss->id); 34008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 34018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, 34031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_OBJECT_PATH, 34041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt paths, wpa_s->num_bss, 34051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 34068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 34088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (i) 34098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths[--i]); 34108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths); 34111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 34128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 34138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 34168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_networks - Get array of networks objects 34171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 34181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 34191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 34201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 34218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 34228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Networks" property. 34238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3424d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_networks( 3425d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 3426d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 34278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 34281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 34298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 34308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **paths; 34318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int i = 0, num = 0; 34321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 34338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3434cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (!wpa_s->dbus_new_path) { 3435cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3436cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt "%s: no D-Bus interface", __func__); 3437cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt return FALSE; 3438cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } 3439cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt 34408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) 344175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!network_is_persistent_group(ssid)) 344275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen num++; 34438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 344461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt paths = os_calloc(num, sizeof(char *)); 34458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!paths) { 34461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_NO_MEMORY, "no memory"); 34471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 34488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 34498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Loop through configured networks and append object path of each */ 34518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) { 345275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (network_is_persistent_group(ssid)) 345375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen continue; 34548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX); 34558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (paths[i] == NULL) { 34566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt dbus_set_error(error, DBUS_ERROR_NO_MEMORY, 34576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "no memory"); 34588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 34598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 34608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Construct the object path for this network. */ 34628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX, 34638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d", 34648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, ssid->id); 34658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 34668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, 34681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_OBJECT_PATH, 34691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt paths, num, error); 34708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 34728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (i) 34738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths[--i]); 34748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths); 34751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 34768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 34778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 348001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_getter_pkcs11_engine_path - Get PKCS #11 engine path 348101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 348201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @error: Location to store error on failure 348301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @user_data: Function specific data 348401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing the PKCS #11 engine path 348501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * 348601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Getter for "PKCS11EnginePath" property. 348701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */ 3488d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_pkcs11_engine_path( 3489d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 3490d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 349101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{ 349201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 349301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 3494293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt return wpas_dbus_string_property_getter(iter, 3495293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt wpa_s->conf->pkcs11_engine_path, 3496293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt error); 349701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt} 349801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 349901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 350001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/** 350101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_getter_pkcs11_module_path - Get PKCS #11 module path 350201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 350301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @error: Location to store error on failure 350401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @user_data: Function specific data 350501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing the PKCS #11 module path 350601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * 350701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Getter for "PKCS11ModulePath" property. 350801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */ 3509d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_pkcs11_module_path( 3510d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 3511d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 351201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{ 351301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 351401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 3515293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt return wpas_dbus_string_property_getter(iter, 3516293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt wpa_s->conf->pkcs11_module_path, 3517293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt error); 351801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt} 351901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 352001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 352101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/** 35228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_blobs - Get all blobs defined for this interface 35231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 35241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 35251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 35261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 35278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 35288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Blobs" property. 35298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3530d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_blobs( 3531d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 3532d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 35338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 35351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter, dict_iter, entry_iter, array_iter; 35368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_config_blob *blob; 35378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 35398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "a{say}", &variant_iter) || 35408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY, 35418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "{say}", &dict_iter)) { 35421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 35431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 35448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 35458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = wpa_s->conf->blobs; 35478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (blob) { 35488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_open_container(&dict_iter, 35498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_DICT_ENTRY, 35508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL, &entry_iter) || 35518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_append_basic(&entry_iter, 35528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_STRING, 35538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &(blob->name)) || 35548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_open_container(&entry_iter, 35558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_ARRAY, 35568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_BYTE_AS_STRING, 35578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &array_iter) || 35588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_append_fixed_array(&array_iter, 35598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_BYTE, 35608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &(blob->data), 35618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->len) || 35628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_close_container(&entry_iter, 35638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &array_iter) || 35648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_close_container(&dict_iter, 35658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &entry_iter)) { 35661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, 35671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "no memory"); 35681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 35698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 35708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = blob->next; 35728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 35738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_close_container(&variant_iter, &dict_iter) || 35751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) { 35761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 35771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 35788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 35798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 35811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 35821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 35831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3584d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_iface_global( 3585d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 3586d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 3587d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt{ 3588d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 3589d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt int ret; 3590d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt char buf[250]; 3591d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt char *p = buf; 3592d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 3593d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt if (!property_desc->data) { 3594d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt dbus_set_error(error, DBUS_ERROR_INVALID_ARGS, 3595d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt "Unhandled interface property %s", 3596d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt property_desc->dbus_property); 3597d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt return FALSE; 3598d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt } 3599d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 3600d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt ret = wpa_config_get_value(property_desc->data, wpa_s->conf, buf, 3601d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt sizeof(buf)); 3602d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt if (ret < 0) 3603d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt *p = '\0'; 3604d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 3605d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, &p, 3606d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt error); 3607d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt} 3608d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 3609d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 3610d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_iface_global( 3611d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 3612d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 3613d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt{ 3614d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 3615d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const char *new_value = NULL; 3616d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt char buf[250]; 3617d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt size_t combined_len; 3618d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt int ret; 3619d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 3620d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING, 3621d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt &new_value)) 3622d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt return FALSE; 3623d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 3624d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt combined_len = os_strlen(property_desc->data) + os_strlen(new_value) + 3625d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 3; 3626d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt if (combined_len >= sizeof(buf)) { 3627d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt dbus_set_error(error, DBUS_ERROR_INVALID_ARGS, 3628d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt "Interface property %s value too large", 3629d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt property_desc->dbus_property); 3630d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt return FALSE; 3631d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt } 3632d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 3633d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt if (!new_value[0]) 3634d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt new_value = "NULL"; 3635d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 3636d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt ret = os_snprintf(buf, combined_len, "%s=%s", property_desc->data, 3637d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt new_value); 3638d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt if (os_snprintf_error(combined_len, ret)) { 3639d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt dbus_set_error(error, WPAS_DBUS_ERROR_UNKNOWN_ERROR, 3640d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt "Failed to construct new interface property %s", 3641d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt property_desc->dbus_property); 3642d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt return FALSE; 3643d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt } 3644d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 3645d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt if (wpa_config_process_global(wpa_s->conf, buf, -1)) { 3646d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt dbus_set_error(error, DBUS_ERROR_INVALID_ARGS, 3647d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt "Failed to set interface property %s", 3648d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt property_desc->dbus_property); 3649d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt return FALSE; 3650d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt } 3651d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 3652d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt wpa_supplicant_update_config(wpa_s); 3653d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt return TRUE; 3654d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt} 3655d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 3656d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 36571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic struct wpa_bss * get_bss_helper(struct bss_handler_args *args, 36581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, const char *func_name) 36591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 36601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res = wpa_bss_get_id(args->wpa_s, args->id); 36611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 36621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) { 36631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_ERROR, "%s[dbus]: no bss with id %d found", 36646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt func_name, args->id); 36651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 36661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: BSS %d not found", 36671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt func_name, args->id); 36681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 36691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 36701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return res; 36718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 36728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 36758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_bssid - Return the BSSID of a BSS 36761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 36771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 36781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 36791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 36808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 36818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSID" property. 36828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3683d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_bssid( 3684d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 3685d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 36868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 36871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 36881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 36898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 36911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 36921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 36938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE, 36951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res->bssid, ETH_ALEN, 36961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 36978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 36988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 37018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ssid - Return the SSID of a BSS 37021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 37031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 37041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 37051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 37068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 37078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "SSID" property. 37088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3709d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_ssid( 3710d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 3711d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 37128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 37131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 37141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 37158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 37171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 37181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 37198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE, 37211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res->ssid, res->ssid_len, 37221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 37238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 37248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 37278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_privacy - Return the privacy flag of a BSS 37281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 37291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 37301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 37311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 37328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 37338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Privacy" property. 37348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3735d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_privacy( 3736d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 3737d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 37388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 37391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 37401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 37418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t privacy; 37428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 37441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 37451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 37468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt privacy = (res->caps & IEEE80211_CAP_PRIVACY) ? TRUE : FALSE; 37481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 37491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &privacy, error); 37508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 37518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 37548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_mode - Return the mode of a BSS 37551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 37561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 37571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 37581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 37598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 37608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Mode" property. 37618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3762d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_mode( 3763d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 3764d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 37658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 37661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 37671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 37688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *mode; 3769ebd93af924f6e54fb4982b3312ff875a4896b62bDmitry Shmidt const u8 *mesh; 37708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 37721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 37731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 377476cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt if (bss_is_dmg(res)) { 377576cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt switch (res->caps & IEEE80211_CAP_DMG_MASK) { 377676cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt case IEEE80211_CAP_DMG_PBSS: 377776cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt case IEEE80211_CAP_DMG_IBSS: 377876cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt mode = "ad-hoc"; 377976cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt break; 378076cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt case IEEE80211_CAP_DMG_AP: 378176cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt mode = "infrastructure"; 378276cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt break; 3783092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart default: 3784092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart mode = ""; 3785092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart break; 378676cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt } 378776cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt } else { 3788ebd93af924f6e54fb4982b3312ff875a4896b62bDmitry Shmidt mesh = wpa_bss_get_ie(res, WLAN_EID_MESH_ID); 3789ebd93af924f6e54fb4982b3312ff875a4896b62bDmitry Shmidt if (mesh) 3790ebd93af924f6e54fb4982b3312ff875a4896b62bDmitry Shmidt mode = "mesh"; 3791ebd93af924f6e54fb4982b3312ff875a4896b62bDmitry Shmidt else if (res->caps & IEEE80211_CAP_IBSS) 379276cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt mode = "ad-hoc"; 379376cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt else 379476cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt mode = "infrastructure"; 379576cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt } 37968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 37981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &mode, error); 37998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 38008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 38038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_level - Return the signal strength of a BSS 38041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 38051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 38061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 38071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 38088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 38098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Level" property. 38108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3811d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_signal( 3812d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 3813d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 38148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 38151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 38161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 3817c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt s16 level; 38188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 38201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 38211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 38228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3823c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt level = (s16) res->level; 38241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT16, 3825c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt &level, error); 38268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 38278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 38308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_frequency - Return the frequency of a BSS 38311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 38321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 38331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 38341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 38358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 38368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Frequency" property. 38378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3838d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_frequency( 3839d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 3840d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 38418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 38421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 38431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 3844c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt u16 freq; 38458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 38471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 38481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 38498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3850c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt freq = (u16) res->freq; 38511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT16, 3852c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt &freq, error); 38538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 38548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int cmp_u8s_desc(const void *a, const void *b) 38578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 38588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return (*(u8 *) b - *(u8 *) a); 38598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 38608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 38638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rates - Return available bit rates of a BSS 38641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 38651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 38661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 38671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 38688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 38698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Rates" property. 38708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3871d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_rates( 3872d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 3873d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 38748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 38751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 38761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 38778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *ie_rates = NULL; 38788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u32 *real_rates; 38798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int rates_num, i; 38801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 38818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 38831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 38841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 38858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt rates_num = wpa_bss_get_bit_rates(res, &ie_rates); 38878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (rates_num < 0) 38881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 38898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt qsort(ie_rates, rates_num, 1, cmp_u8s_desc); 38918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt real_rates = os_malloc(sizeof(u32) * rates_num); 38938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!real_rates) { 38948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ie_rates); 38951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 38961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 38978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 38988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < rates_num; i++) 39008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt real_rates[i] = ie_rates[i] * 500000; 39018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_UINT32, 39031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt real_rates, rates_num, 39041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 39058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ie_rates); 39078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(real_rates); 39081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 39098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 39108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3912d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtstatic dbus_bool_t wpas_dbus_get_bss_security_prop( 3913d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 3914d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, struct wpa_ie_data *ie_data, DBusError *error) 39158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 39161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter iter_dict, variant_iter; 39178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *group; 3918fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt const char *pairwise[5]; /* max 5 pairwise ciphers is supported */ 3919807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt const char *key_mgmt[9]; /* max 9 key managements may be supported */ 39208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int n; 39218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 39238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "a{sv}", &variant_iter)) 39248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 39258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict)) 39278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 39288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* KeyMgmt */ 39308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt n = 0; 39318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK) 39328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-psk"; 39338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_PSK) 39348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-ft-psk"; 39358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK_SHA256) 39368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-psk-sha256"; 39378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X) 39388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-eap"; 39398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X) 39408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-ft-eap"; 39418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256) 39428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-eap-sha256"; 3943807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#ifdef CONFIG_SUITEB 39446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B) 39456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt key_mgmt[n++] = "wpa-eap-suite-b"; 3946807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#endif /* CONFIG_SUITEB */ 3947807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#ifdef CONFIG_SUITEB192 3948807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B_192) 3949807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt key_mgmt[n++] = "wpa-eap-suite-b-192"; 3950807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#endif /* CONFIG_SUITEB192 */ 39518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_NONE) 39528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-none"; 39538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array(&iter_dict, "KeyMgmt", 39558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt, n)) 39568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 39578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Group */ 39598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (ie_data->group_cipher) { 39608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_WEP40: 39618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "wep40"; 39628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 39638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_TKIP: 39648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "tkip"; 39658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 39668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_CCMP: 39678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "ccmp"; 39688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 396961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt case WPA_CIPHER_GCMP: 397061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt group = "gcmp"; 397161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt break; 39728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_WEP104: 39738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "wep104"; 39748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 3975fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt case WPA_CIPHER_CCMP_256: 3976fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt group = "ccmp-256"; 3977fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt break; 3978fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt case WPA_CIPHER_GCMP_256: 3979fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt group = "gcmp-256"; 3980fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt break; 39818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 39828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = ""; 39838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 39848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 39858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string(&iter_dict, "Group", group)) 39878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 39888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Pairwise */ 39908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt n = 0; 39918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_TKIP) 39928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pairwise[n++] = "tkip"; 39938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_CCMP) 39948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pairwise[n++] = "ccmp"; 399561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_GCMP) 399661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pairwise[n++] = "gcmp"; 3997fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_CCMP_256) 3998fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt pairwise[n++] = "ccmp-256"; 3999fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_GCMP_256) 4000fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt pairwise[n++] = "gcmp-256"; 40018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array(&iter_dict, "Pairwise", 40038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pairwise, n)) 40048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 40058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Management group (RSN only) */ 40078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->proto == WPA_PROTO_RSN) { 40088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (ie_data->mgmt_group_cipher) { 40098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 40108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_AES_128_CMAC: 40118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "aes128cmac"; 40128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 40138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 40148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 40158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = ""; 40168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 40178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 40188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string(&iter_dict, "MgmtGroup", 40208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group)) 40218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 40228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 40238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict) || 40256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) 40268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 40278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 40298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem: 40311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 40321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 40338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 40348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 40378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_wpa - Return the WPA options of a BSS 40381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 40391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 40401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 40411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 40428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 40438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "WPA" property. 40448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 4045d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_wpa( 4046d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 4047d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 40488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 40491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 40501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 40518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ie_data wpa_data; 40528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *ie; 40538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 40551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 40561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 40578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&wpa_data, 0, sizeof(wpa_data)); 40598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie = wpa_bss_get_vendor_ie(res, WPA_IE_VENDOR_TYPE); 40606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (ie && wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0) { 40616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 40626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "failed to parse WPA IE"); 40636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return FALSE; 40648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 40658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4066d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt return wpas_dbus_get_bss_security_prop(property_desc, iter, &wpa_data, error); 40678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 40688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 40718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rsn - Return the RSN options of a BSS 40721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 40731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 40741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 40751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 40768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 40778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "RSN" property. 40788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 4079d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_rsn( 4080d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 4081d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 40828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 40831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 40841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 40858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ie_data wpa_data; 40868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *ie; 40878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 40891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 40901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 40918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&wpa_data, 0, sizeof(wpa_data)); 40938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie = wpa_bss_get_ie(res, WLAN_EID_RSN); 40946c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (ie && wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0) { 40956c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 40966c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "failed to parse RSN IE"); 40976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return FALSE; 40988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 40998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4100d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt return wpas_dbus_get_bss_security_prop(property_desc, iter, &wpa_data, error); 41018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 41028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 41038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 41048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 4105d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * wpas_dbus_getter_bss_wps - Return the WPS options of a BSS 4106d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @iter: Pointer to incoming dbus message iter 4107d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @error: Location to store error on failure 4108d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @user_data: Function specific data 4109d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Returns: TRUE on success, FALSE on failure 4110d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * 4111d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Getter for "WPS" property. 4112d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt */ 4113d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_wps( 4114d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 4115d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 4116d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{ 4117d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt struct bss_handler_args *args = user_data; 4118d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt struct wpa_bss *res; 4119d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_WPS 4120d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt struct wpabuf *wps_ie; 4121d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_WPS */ 4122d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt DBusMessageIter iter_dict, variant_iter; 41238347444e0bfb85e4550817fc99903f38ce8f5bccDmitry Shmidt int wps_support = 0; 4124d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt const char *type = ""; 4125d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 4126d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt res = get_bss_helper(args, error, __func__); 4127d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (!res) 4128d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return FALSE; 4129d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 4130d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 41316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "a{sv}", &variant_iter) || 41326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_open_write(&variant_iter, &iter_dict)) 4133d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt goto nomem; 4134d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 4135d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_WPS 4136d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt wps_ie = wpa_bss_get_vendor_ie_multi(res, WPS_IE_VENDOR_TYPE); 4137d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (wps_ie) { 41388347444e0bfb85e4550817fc99903f38ce8f5bccDmitry Shmidt wps_support = 1; 4139d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (wps_is_selected_pbc_registrar(wps_ie)) 4140d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt type = "pbc"; 4141d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt else if (wps_is_selected_pin_registrar(wps_ie)) 4142d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt type = "pin"; 41436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 41446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpabuf_free(wps_ie); 4145d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt } 4146d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_WPS */ 4147d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 41488347444e0bfb85e4550817fc99903f38ce8f5bccDmitry Shmidt if ((wps_support && !wpa_dbus_dict_append_string(&iter_dict, "Type", type)) || 41496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_close_write(&variant_iter, &iter_dict) || 41506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) 4151d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt goto nomem; 4152d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 4153d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return TRUE; 4154d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 4155d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtnomem: 4156d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 4157d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return FALSE; 4158d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt} 4159d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 4160d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 4161d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt/** 41628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ies - Return all IEs of a BSS 41631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 41641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 41651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 41661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 41678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 41688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "IEs" property. 41698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 4170d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_ies( 4171d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 4172d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 41738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 41741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 41751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 41768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 41771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 41781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 41791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 41808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 41811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE, 41821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res + 1, res->ie_len, 41831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 41848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 41858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 41868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 41878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 4188661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * wpas_dbus_getter_bss_age - Return time in seconds since BSS was last seen 4189661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 4190661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @error: Location to store error on failure 4191661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @user_data: Function specific data 4192661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Returns: TRUE on success, FALSE on failure 4193661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * 4194661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Getter for BSS age 4195661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt */ 4196d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_age( 4197d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 4198d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 4199661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt{ 4200661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt struct bss_handler_args *args = user_data; 4201661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt struct wpa_bss *res; 4202661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt struct os_reltime now, diff = { 0, 0 }; 4203661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt u32 age; 4204661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 4205661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt res = get_bss_helper(args, error, __func__); 4206661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (!res) 4207661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt return FALSE; 4208661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 4209661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt os_get_reltime(&now); 4210661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt os_reltime_sub(&now, &res->last_update, &diff); 4211661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt age = diff.sec > 0 ? diff.sec : 0; 4212661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, &age, 4213661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt error); 4214661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt} 4215661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 4216661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 4217661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt/** 42188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_enabled - Check whether network is enabled or disabled 42191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 42201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 42211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 42221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 42238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 42248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "enabled" property of a configured network. 42258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 4226d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_enabled( 4227d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 4228d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 42298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 42301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct network_handler_args *net = user_data; 42318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t enabled = net->ssid->disabled ? FALSE : TRUE; 42321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 42331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 42341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &enabled, error); 42358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 42368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 42378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 42388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 42398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_enabled - Mark a configured network as enabled or disabled 42401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 42411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 42421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 42431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 42448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 42458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Enabled" property of a configured network. 42468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 4247d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_enabled( 4248d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 4249d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 42508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 42511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct network_handler_args *net = user_data; 42528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 42538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 42548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t enable; 42558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 42561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, 42571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &enable)) 42581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 42598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 42608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s = net->wpa_s; 42618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = net->ssid; 42628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 42638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (enable) 42648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_enable_network(wpa_s, ssid); 42658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 42668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_disable_network(wpa_s, ssid); 42678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 42681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 42698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 42708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 42718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 42728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 42738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_network_properties - Get options for a configured network 42741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 42751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 42761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 42771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 42788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 42798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Properties" property of a configured network. 42808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 4281d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_network_properties( 4282d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 4283d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 42848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 42851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct network_handler_args *net = user_data; 42861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter, dict_iter; 42878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **iterator; 42888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **props = wpa_config_get_all(net->ssid, 1); 42891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 42908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 42911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!props) { 42921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 42931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 42948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 42958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 42961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, "a{sv}", 42971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &variant_iter) || 42988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !wpa_dbus_dict_open_write(&variant_iter, &dict_iter)) { 42991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 43008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 43018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 43028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 43038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator = props; 43048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*iterator) { 43058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string(&dict_iter, *iterator, 43068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *(iterator + 1))) { 43071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, 43081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "no memory"); 43098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 43108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 43118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator += 2; 43128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 43138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 43148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 43158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_close_write(&variant_iter, &dict_iter) || 43161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) { 43171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 43188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 43198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 43208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 43211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = TRUE; 43221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 43238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 43248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator = props; 43258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*iterator) { 43268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(*iterator); 43278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator++; 43288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 43298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(props); 43301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 43318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 43328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 43338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 43348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 43358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_network_properties - Set options for a configured network 43361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 43371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 43381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 43391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 43408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 43418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Properties" property of a configured network. 43428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 4343d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_network_properties( 4344d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt const struct wpa_dbus_property_desc *property_desc, 4345d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt DBusMessageIter *iter, DBusError *error, void *user_data) 43468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 43471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct network_handler_args *net = user_data; 43488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid = net->ssid; 43491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter; 43508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 43511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_message_iter_recurse(iter, &variant_iter); 43521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return set_network_properties(net->wpa_s, ssid, &variant_iter, error); 43538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 435404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 435504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 435604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AP 435704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 435804949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_subscribe_preq( 435904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessage *message, struct wpa_supplicant *wpa_s) 436004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 436104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpas_dbus_priv *priv = wpa_s->global->dbus; 436204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *name; 436304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 436404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_s->preq_notify_peer != NULL) { 436504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strcmp(dbus_message_get_sender(message), 436604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->preq_notify_peer) == 0) 436704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 436804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 436904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return dbus_message_new_error(message, 437004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_DBUS_ERROR_SUBSCRIPTION_IN_USE, 437104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "Another application is already subscribed"); 437204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 437304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 437404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt name = os_strdup(dbus_message_get_sender(message)); 437504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!name) 43766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpas_dbus_error_no_memory(message); 437704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 437804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->preq_notify_peer = name; 437904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 438004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* Subscribe to clean up if application closes socket */ 438104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpas_dbus_subscribe_noc(priv); 438204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 438304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* 438404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Double-check it's still alive to make sure that we didn't 438504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * miss the NameOwnerChanged signal, e.g. while strdup'ing. 438604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 438704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_bus_name_has_owner(priv->con, name, NULL)) { 438804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* 438904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Application no longer exists, clean up. 439004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * The return value is irrelevant now. 439104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 439204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Need to check if the NameOwnerChanged handling 439304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * already cleaned up because we have processed 439404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * DBus messages while checking if the name still 439504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * has an owner. 439604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 439704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpa_s->preq_notify_peer) 439804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 439904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(wpa_s->preq_notify_peer); 440004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->preq_notify_peer = NULL; 440104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpas_dbus_unsubscribe_noc(priv); 440204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 440304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 440404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 440504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 440604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 440704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 440804949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_unsubscribe_preq( 440904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessage *message, struct wpa_supplicant *wpa_s) 441004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 441104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpas_dbus_priv *priv = wpa_s->global->dbus; 441204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 441304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpa_s->preq_notify_peer) 441404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return dbus_message_new_error(message, 441504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_DBUS_ERROR_NO_SUBSCRIPTION, 441604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "Not subscribed"); 441704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 441804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strcmp(wpa_s->preq_notify_peer, 441904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_get_sender(message))) 442004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return dbus_message_new_error(message, 442104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_DBUS_ERROR_SUBSCRIPTION_EPERM, 442204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "Can't unsubscribe others"); 442304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 442404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(wpa_s->preq_notify_peer); 442504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->preq_notify_peer = NULL; 442604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpas_dbus_unsubscribe_noc(priv); 442704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 442804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 442904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 443004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 443104949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid wpas_dbus_signal_preq(struct wpa_supplicant *wpa_s, 443204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const u8 *addr, const u8 *dst, const u8 *bssid, 443304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const u8 *ie, size_t ie_len, u32 ssi_signal) 443404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 443504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessage *msg; 443604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessageIter iter, dict_iter; 443704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpas_dbus_priv *priv = wpa_s->global->dbus; 443804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 443904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* Do nothing if the control interface is not turned on */ 4440cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (priv == NULL || !wpa_s->dbus_new_path) 444104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return; 444204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 444304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_s->preq_notify_peer == NULL) 444404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return; 444504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 444604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt msg = dbus_message_new_signal(wpa_s->dbus_new_path, 444704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_DBUS_NEW_IFACE_INTERFACE, 444804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "ProbeRequest"); 444904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (msg == NULL) 445004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return; 445104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 445204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_set_destination(msg, wpa_s->preq_notify_peer); 445304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 445404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_iter_init_append(msg, &iter); 445504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 44566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!wpa_dbus_dict_open_write(&iter, &dict_iter) || 44576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (addr && !wpa_dbus_dict_append_byte_array(&dict_iter, "addr", 44586c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (const char *) addr, 44596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ETH_ALEN)) || 44606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (dst && !wpa_dbus_dict_append_byte_array(&dict_iter, "dst", 44616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (const char *) dst, 44626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ETH_ALEN)) || 44636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (bssid && !wpa_dbus_dict_append_byte_array(&dict_iter, "bssid", 44646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (const char *) bssid, 44656c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ETH_ALEN)) || 44666c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (ie && ie_len && !wpa_dbus_dict_append_byte_array(&dict_iter, "ies", 44676c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (const char *) ie, 44686c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ie_len)) || 44696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (ssi_signal && !wpa_dbus_dict_append_int32(&dict_iter, "signal", 44706c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ssi_signal)) || 44716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_close_write(&iter, &dict_iter)) 447204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto fail; 447304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 447404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_connection_send(priv->con, msg, NULL); 447504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto out; 447604949598a23f501be6eec21697465fd46a28840aDmitry Shmidtfail: 447704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "dbus: Failed to construct signal"); 447804949598a23f501be6eec21697465fd46a28840aDmitry Shmidtout: 447904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_unref(msg); 448004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 448104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 448204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AP */ 448355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt 448455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt 448555840adb6cd32ca52064f327b72a40e769f70661Dmitry ShmidtDBusMessage * wpas_dbus_handler_vendor_elem_add(DBusMessage *message, 448655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt struct wpa_supplicant *wpa_s) 448755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt{ 448855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt u8 *ielems; 448955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt int len; 449055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt struct ieee802_11_elems elems; 449155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt dbus_int32_t frame_id; 449255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt DBusMessageIter iter, array; 449355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt 449455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt dbus_message_iter_init(message, &iter); 449555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt dbus_message_iter_get_basic(&iter, &frame_id); 449655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt if (frame_id < 0 || frame_id >= NUM_VENDOR_ELEM_FRAMES) { 449755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS, 449855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt "Invalid ID"); 449955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt } 450055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt 450155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt dbus_message_iter_next(&iter); 450255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt dbus_message_iter_recurse(&iter, &array); 450355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt dbus_message_iter_get_fixed_array(&array, &ielems, &len); 450455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt if (!ielems || len == 0) { 450555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt return dbus_message_new_error( 450655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt message, DBUS_ERROR_INVALID_ARGS, "Invalid value"); 450755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt } 450855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt 450955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt if (ieee802_11_parse_elems(ielems, len, &elems, 0) == ParseFailed) { 451055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS, 451155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt "Parse error"); 451255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt } 451355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt 451455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt wpa_s = wpas_vendor_elem(wpa_s, frame_id); 451555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt if (!wpa_s->vendor_elem[frame_id]) { 451655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt wpa_s->vendor_elem[frame_id] = wpabuf_alloc_copy(ielems, len); 451755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt wpas_vendor_elem_update(wpa_s); 451855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt return NULL; 451955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt } 452055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt 452155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt if (wpabuf_resize(&wpa_s->vendor_elem[frame_id], len) < 0) { 452255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS, 452355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt "Resize error"); 452455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt } 452555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt 452655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt wpabuf_put_data(wpa_s->vendor_elem[frame_id], ielems, len); 452755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt wpas_vendor_elem_update(wpa_s); 452855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt return NULL; 452955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt} 453055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt 453155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt 453255840adb6cd32ca52064f327b72a40e769f70661Dmitry ShmidtDBusMessage * wpas_dbus_handler_vendor_elem_get(DBusMessage *message, 453355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt struct wpa_supplicant *wpa_s) 453455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt{ 453555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt DBusMessage *reply; 453655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt DBusMessageIter iter, array_iter; 453755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt dbus_int32_t frame_id; 453855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt const u8 *elem; 453955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt size_t elem_len; 454055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt 454155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt dbus_message_iter_init(message, &iter); 454255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt dbus_message_iter_get_basic(&iter, &frame_id); 454355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt 454455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt if (frame_id < 0 || frame_id >= NUM_VENDOR_ELEM_FRAMES) { 454555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS, 454655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt "Invalid ID"); 454755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt } 454855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt 454955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt wpa_s = wpas_vendor_elem(wpa_s, frame_id); 455055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt if (!wpa_s->vendor_elem[frame_id]) { 455155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS, 455255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt "ID value does not exist"); 455355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt } 455455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt 455555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt reply = dbus_message_new_method_return(message); 455655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt if (!reply) 455755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt return wpas_dbus_error_no_memory(message); 455855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt 455955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt dbus_message_iter_init_append(reply, &iter); 456055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt 456155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt elem = wpabuf_head_u8(wpa_s->vendor_elem[frame_id]); 456255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt elem_len = wpabuf_len(wpa_s->vendor_elem[frame_id]); 456355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt 456455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, 456555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt DBUS_TYPE_BYTE_AS_STRING, 456655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt &array_iter) || 456755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt !dbus_message_iter_append_fixed_array(&array_iter, DBUS_TYPE_BYTE, 456855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt &elem, elem_len) || 456955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt !dbus_message_iter_close_container(&iter, &array_iter)) { 457055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt dbus_message_unref(reply); 457155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt reply = wpas_dbus_error_no_memory(message); 457255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt } 457355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt 457455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt return reply; 457555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt} 457655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt 457755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt 457855840adb6cd32ca52064f327b72a40e769f70661Dmitry ShmidtDBusMessage * wpas_dbus_handler_vendor_elem_remove(DBusMessage *message, 457955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt struct wpa_supplicant *wpa_s) 458055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt{ 458155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt u8 *ielems; 458255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt int len; 458355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt struct ieee802_11_elems elems; 458455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt DBusMessageIter iter, array; 458555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt dbus_int32_t frame_id; 458655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt 458755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt dbus_message_iter_init(message, &iter); 458855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt dbus_message_iter_get_basic(&iter, &frame_id); 458955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt if (frame_id < 0 || frame_id >= NUM_VENDOR_ELEM_FRAMES) { 459055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS, 459155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt "Invalid ID"); 459255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt } 459355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt 459455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt dbus_message_iter_next(&iter); 459555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt dbus_message_iter_recurse(&iter, &array); 459655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt dbus_message_iter_get_fixed_array(&array, &ielems, &len); 459755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt if (!ielems || len == 0) { 459855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS, 459955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt "Invalid value"); 460055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt } 460155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt 460255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt wpa_s = wpas_vendor_elem(wpa_s, frame_id); 460355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt 460455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt if (len == 1 && *ielems == '*') { 460555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt wpabuf_free(wpa_s->vendor_elem[frame_id]); 460655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt wpa_s->vendor_elem[frame_id] = NULL; 460755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt wpas_vendor_elem_update(wpa_s); 460855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt return NULL; 460955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt } 461055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt 461155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt if (!wpa_s->vendor_elem[frame_id]) { 461255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS, 461355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt "ID value does not exist"); 461455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt } 461555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt 461655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt if (ieee802_11_parse_elems(ielems, len, &elems, 0) == ParseFailed) { 461755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS, 461855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt "Parse error"); 461955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt } 462055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt 462155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt if (wpas_vendor_elem_remove(wpa_s, frame_id, ielems, len) == 0) 462255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt return NULL; 462355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt 462455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS, 462555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt "Not found"); 462655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt} 4627