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