dbus_new_handlers.c revision cc00d5dc8483e32158b2ba61ea44b0c38d790ed7
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); 2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (size <= 0) 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size += 3; 2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(value, size, "\"%s\"", 2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.str_value); 2276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(size, ret)) 2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_strdup(entry.str_value); 2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (entry.type == DBUS_TYPE_UINT32) { 2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(value, size, "%u", 2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.uint32_value); 2416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(size, ret)) 2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (entry.type == DBUS_TYPE_INT32) { 2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(value, size, "%d", 2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.int32_value); 2506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(size, ret)) 2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else 2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_set(ssid, entry.key, value, 0) < 0) 2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2582f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt if (os_strcmp(entry.key, "bssid") != 0 && 2592f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt os_strcmp(entry.key, "priority") != 0) 2602f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt wpa_sm_pmksa_cache_flush(wpa_s->wpa, ssid); 2612f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt 2622f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt if (wpa_s->current_ssid == ssid || 2632f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt wpa_s->current_ssid == NULL) { 2642f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt /* 2652f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt * Invalidate the EAP session cache if anything in the 2662f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt * current or previously used configuration changes. 2672f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt */ 2682f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt eapol_sm_invalidate_cached_session(wpa_s->eapol); 2692f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt } 2702f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt 2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((os_strcmp(entry.key, "psk") == 0 && 2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value[0] == '"' && ssid->ssid_len) || 27304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt (os_strcmp(entry.key, "ssid") == 0 && ssid->passphrase)) 2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_update_psk(ssid); 2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (os_strcmp(entry.key, "priority") == 0) 2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_update_prio_list(wpa_s->conf); 2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 279623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt value = NULL; 2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 2841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidterror: 2861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(value); 2871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 2881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_INVALID_ARGS, 2891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "invalid message format"); 2901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_property_getter - Get basic type property 2961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Message iter to use when appending arguments 2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property (must be basic type) 2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @val: pointer to place holding property value 2991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: On failure an error describing the failure 3001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request was successful, FALSE if it failed 3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic getter for basic type properties. Type is required to be basic. 3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_property_getter(DBusMessageIter *iter, 3051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const int type, 3061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const void *val, 3071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error) 3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter; 3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_type_is_basic(type)) { 3121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: given type is not basic", __func__); 3141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 3186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_dbus_type_as_string(type), 3196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &variant_iter) || 3206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_append_basic(&variant_iter, type, val) || 3216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) { 3226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3236c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: error constructing reply", __func__); 3246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return FALSE; 3256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt } 3261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_property_setter - Set basic type property 3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property (must be basic type) 3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @val: pointer to place where value being set will be stored 3361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request was successful, FALSE if it failed 3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic setter for basic type properties. Type is required to be basic. 3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_property_setter(DBusMessageIter *iter, 3411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 3421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const int type, void *val) 3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter; 3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_type_is_basic(type)) { 3471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: given type is not basic", __func__); 3491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Look at the new value */ 3531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_message_iter_recurse(iter, &variant_iter); 3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&variant_iter) != type) { 3551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 3561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "wrong property type"); 3571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&variant_iter, val); 3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_array_property_getter - Get array type property 3671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iterator 3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property array elements (must be basic type) 3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @array: pointer to array of elements to put into response message 3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @array_len: length of above array 3711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: a pointer to an error to fill on failure 3721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request succeeded, FALSE if it failed 3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic getter for array type properties. Array elements type is 3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * required to be basic. 3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_array_property_getter(DBusMessageIter *iter, 3781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const int type, 3791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const void *array, 3801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt size_t array_len, 3811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error) 3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter, array_iter; 3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char type_str[] = "a?"; /* ? will be replaced with subtype letter; */ 3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *sub_type_str; 3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t element_size, i; 3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_type_is_basic(type)) { 3891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: given type is not basic", __func__); 3911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sub_type_str = wpa_dbus_type_as_string(type); 3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt type_str[1] = sub_type_str[0]; 3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 3986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt type_str, &variant_iter) || 3996c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY, 4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sub_type_str, &array_iter)) { 4011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 4026c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: failed to construct message", __func__); 4031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt switch (type) { 4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_BYTE: 4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_BOOLEAN: 4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = 1; 4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_INT16: 4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_UINT16: 4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(uint16_t); 4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_INT32: 4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_UINT32: 4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(uint32_t); 4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_INT64: 4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_UINT64: 4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(uint64_t); 4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_DOUBLE: 4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(double); 4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_STRING: 4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_OBJECT_PATH: 4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(char *); 4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 4311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 4326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: unknown element type %d", __func__, type); 4331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < array_len; i++) { 43743cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt if (!dbus_message_iter_append_basic(&array_iter, type, 43843cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt array + i * element_size)) { 43943cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 44043cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt "%s: failed to construct message 2.5", 44143cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt __func__); 44243cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt return FALSE; 44343cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt } 4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!dbus_message_iter_close_container(&variant_iter, &array_iter) || 4476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) { 4481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 4496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: failed to construct message 3", __func__); 4501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 4511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 4521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 4531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 45804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_simple_array_array_property_getter - Get array array type property 45904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iterator 46004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @type: DBus type of property array elements (must be basic type) 46104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @array: pointer to array of elements to put into response message 46204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @array_len: length of above array 46304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: a pointer to an error to fill on failure 46404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE if the request succeeded, FALSE if it failed 46504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 46604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Generic getter for array type properties. Array elements type is 46704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * required to be basic. 46804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 46904949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_simple_array_array_property_getter(DBusMessageIter *iter, 47004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const int type, 47104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpabuf **array, 47204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt size_t array_len, 47304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusError *error) 47404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 47504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessageIter variant_iter, array_iter; 47604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char type_str[] = "aa?"; 47704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char inner_type_str[] = "a?"; 47804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const char *sub_type_str; 47904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt size_t i; 48004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 48104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_type_is_basic(type)) { 48204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 48304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "%s: given type is not basic", __func__); 48404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 48504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 48604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 48704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt sub_type_str = wpa_dbus_type_as_string(type); 48804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt type_str[2] = sub_type_str[0]; 48904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt inner_type_str[1] = sub_type_str[0]; 49004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 49104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 4926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt type_str, &variant_iter) || 4936c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY, 49404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt inner_type_str, &array_iter)) { 49504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 4966c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: failed to construct message", __func__); 49704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 49804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 49904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 500c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt for (i = 0; i < array_len && array[i]; i++) { 50104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_dbus_dict_bin_array_add_element(&array_iter, 50204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpabuf_head(array[i]), 50304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpabuf_len(array[i])); 50404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 50504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 50604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 5076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!dbus_message_iter_close_container(&variant_iter, &array_iter) || 5086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) { 50904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 5106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: failed to close message", __func__); 51104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 51204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 51304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 51404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return TRUE; 51504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 51604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 51704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 51804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_create_interface - Request registration of a network iface 5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure 5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the new interface object, 5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or a dbus error message with more information 5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "CreateInterface" method call. Handles requests 5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to register a network interface that wpa_supplicant 5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * will manage. 5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_create_interface(DBusMessage *message, 5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter_dict; 5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter; 5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_dbus_dict_entry entry; 5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *driver = NULL; 5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *ifname = NULL; 5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *confname = NULL; 5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *bridge_ifname = NULL; 5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpa_dbus_dict_open_read(&iter, &iter_dict, NULL)) 5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (wpa_dbus_dict_has_dict_entry(&iter_dict)) { 5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_get_entry(&iter_dict, &entry)) 5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 5486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_strcmp(entry.key, "Driver") == 0 && 5496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt entry.type == DBUS_TYPE_STRING) { 550623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt os_free(driver); 5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt driver = os_strdup(entry.str_value); 5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (driver == NULL) 554ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt goto oom; 5556c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt } else if (os_strcmp(entry.key, "Ifname") == 0 && 5566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt entry.type == DBUS_TYPE_STRING) { 557623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt os_free(ifname); 5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ifname = os_strdup(entry.str_value); 5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ifname == NULL) 561ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt goto oom; 5626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt } else if (os_strcmp(entry.key, "ConfigFile") == 0 && 5636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt entry.type == DBUS_TYPE_STRING) { 564623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt os_free(confname); 5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt confname = os_strdup(entry.str_value); 5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (confname == NULL) 568ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt goto oom; 5696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt } else if (os_strcmp(entry.key, "BridgeIfname") == 0 && 5706c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt entry.type == DBUS_TYPE_STRING) { 571623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt os_free(bridge_ifname); 5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bridge_ifname = os_strdup(entry.str_value); 5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bridge_ifname == NULL) 575ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt goto oom; 5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ifname == NULL) 5838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; /* Required Ifname argument missing */ 5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Try to get the wpa_supplicant record for this iface, return 5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * an error if we already control it. 5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_get_iface(global, ifname) != NULL) { 5906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = dbus_message_new_error( 5916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, WPAS_DBUS_ERROR_IFACE_EXISTS, 5926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "wpa_supplicant already controls this interface."); 5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_interface iface; 5966c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&iface, 0, sizeof(iface)); 5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.driver = driver; 5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.ifname = ifname; 6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.confname = confname; 6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.bridge_ifname = bridge_ifname; 6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Otherwise, have wpa_supplicant attach to it. */ 603203eadb9eda41a1dde4a583edb4684319e3f399eDmitry Shmidt wpa_s = wpa_supplicant_add_iface(global, &iface, NULL); 604cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s && wpa_s->dbus_new_path) { 6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *path = wpa_s->dbus_new_path; 6066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, 6096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &path, DBUS_TYPE_INVALID); 6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 6118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_unknown_error( 6126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 6136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "wpa_supplicant couldn't grab this interface."); 6148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 6188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(driver); 6198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ifname); 62061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_free(confname); 6218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bridge_ifname); 6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterror: 6258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, NULL); 6268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 627ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidtoom: 628ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt reply = wpas_dbus_error_no_memory(message); 629ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt goto out; 6308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 6348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_interface - Request deregistration of an interface 6358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: wpa_supplicant global data structure 6378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing a UINT32 indicating success (1) or 6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * failure (0), or returns a dbus error message with more information 6398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "removeInterface" method call. Handles requests 6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to deregister a network interface that wpa_supplicant 6428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * currently manages. 6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_interface(DBusMessage *message, 6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *path; 6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &path, 6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s = get_iface_by_dbus_path(global, path); 6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s == NULL) 6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_iface_unknown(message); 657c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt else if (wpa_supplicant_remove_iface(global, wpa_s, 0)) { 6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_unknown_error( 6596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 6606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "wpa_supplicant couldn't remove this interface."); 6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_interface - Get the object path for an interface name 6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure 6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the interface object, 6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or a dbus error message with more information 6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "getInterface" method call. 6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_interface(DBusMessage *message, 6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *ifname; 6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *path; 6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &ifname, 6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s = wpa_supplicant_get_iface(global, ifname); 688cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s == NULL || wpa_s->dbus_new_path == NULL) 6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_error_iface_unknown(message); 6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt path = wpa_s->dbus_new_path; 6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply == NULL) 6946c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpas_dbus_error_no_memory(message); 6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path, 6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID)) { 6978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 6986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpas_dbus_error_no_memory(message); 6998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_level - Get debug level 7071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 7081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 7091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 7101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 7118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugLevel" property. 7138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_level(DBusMessageIter *iter, 7151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 7161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 7178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *str; 7198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int idx = wpa_debug_level; 7201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 7218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (idx < 0) 7228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt idx = 0; 7238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (idx > 5) 7248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt idx = 5; 7258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt str = debug_strings[idx]; 7261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 7271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &str, error); 7288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_timestamp - Get debug timestamp 7331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 7341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 7351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 7361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 7378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugTimestamp" property. 7398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_timestamp(DBusMessageIter *iter, 7416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt DBusError *error, 7426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt void *user_data) 7438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 7451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &wpa_debug_timestamp, error); 7468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_show_keys - Get debug show keys 7521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 7531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 7541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 7551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 7568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugShowKeys" property. 7588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_show_keys(DBusMessageIter *iter, 7601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 7611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 7628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 7641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &wpa_debug_show_keys, error); 7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_level - Set debug level 7701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 7711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 7721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 7731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 7748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugLevel" property. 7768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_level(DBusMessageIter *iter, 7781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 7798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_global *global = user_data; 7818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *str = NULL; 7828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i, val = -1; 7838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING, 7851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &str)) 7861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 7878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; debug_strings[i]; i++) 7898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(debug_strings[i], str) == 0) { 7908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val = i; 7918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 7928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (val < 0 || 7958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_set_debug_params(global, val, wpa_debug_timestamp, 7968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_show_keys)) { 7976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 7986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "wrong debug level value"); 7991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 8008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 8038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 8078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_timestamp - Set debug timestamp 8081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 8091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 8101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 8111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 8128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 8138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugTimestamp" property. 8148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 8151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_timestamp(DBusMessageIter *iter, 8161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 8171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 8188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_global *global = user_data; 8208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t val; 8218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, 8231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &val)) 8241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 8258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_set_debug_params(global, wpa_debug_level, val ? 1 : 0, 8278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_show_keys); 8281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 8298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 8338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_show_keys - Set debug show keys 8341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 8351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 8361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 8371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 8388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 8398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugShowKeys" property. 8408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 8411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_show_keys(DBusMessageIter *iter, 8421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 8431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 8448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_global *global = user_data; 8468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t val; 8478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, 8491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &val)) 8501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 8518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_set_debug_params(global, wpa_debug_level, 8538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_timestamp, 8548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val ? 1 : 0); 8551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 8568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 8608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_interfaces - Request registered interfaces list 8611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 8621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 8631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 8641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 8658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 8668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Interfaces" property. Handles requests 8678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of registered interfaces objects 8688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * paths 8698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 8701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_interfaces(DBusMessageIter *iter, 8711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 8721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 8738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_global *global = user_data; 8758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 8768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char **paths; 8778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int i = 0, num = 0; 8781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success; 8798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 880cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) { 881cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s->dbus_new_path) 882cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt num++; 883cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } 8848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 88561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt paths = os_calloc(num, sizeof(char *)); 8868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!paths) { 8871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 8881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 8898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 891cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) { 892cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s->dbus_new_path) 893cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt paths[i++] = wpa_s->dbus_new_path; 894cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } 8958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, 8971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_OBJECT_PATH, 8981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt paths, num, error); 8998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths); 9011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 9028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 9068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_eap_methods - Request supported EAP methods list 9071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 9081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 9091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 9101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 9118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 9128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "EapMethods" property. Handles requests 9138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of strings with supported EAP methods 9148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 9151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_eap_methods(DBusMessageIter *iter, 9161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 9178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **eap_methods; 9198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t num_items = 0; 9201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success; 9218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eap_methods = eap_get_names_as_string_array(&num_items); 9238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!eap_methods) { 9241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 9251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 9268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, 9291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_STRING, 9301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt eap_methods, 9311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt num_items, error); 9328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (num_items) 9348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(eap_methods[--num_items]); 9358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(eap_methods); 9361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 9378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 940d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt/** 941d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * wpas_dbus_getter_global_capabilities - Request supported global capabilities 942d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @iter: Pointer to incoming dbus message iter 943d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @error: Location to store error on failure 944d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @user_data: Function specific data 945d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Returns: TRUE on success, FALSE on failure 946d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * 947d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Getter for "Capabilities" property. Handles requests by dbus clients to 948d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * return a list of strings with supported capabilities like AP, RSN IBSS, 949d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * and P2P that are determined at compile time. 950d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt */ 951d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtdbus_bool_t wpas_dbus_getter_global_capabilities(DBusMessageIter *iter, 9526c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt DBusError *error, 9536c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt void *user_data) 954d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{ 955d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt const char *capabilities[5] = { NULL, NULL, NULL, NULL, NULL }; 956d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt size_t num_items = 0; 957d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 958d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_AP 959d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities[num_items++] = "ap"; 960d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_AP */ 961d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_IBSS_RSN 962d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities[num_items++] = "ibss-rsn"; 963d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_IBSS_RSN */ 964d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_P2P 965d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities[num_items++] = "p2p"; 966d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_P2P */ 967d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_INTERWORKING 968d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities[num_items++] = "interworking"; 969d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_INTERWORKING */ 970d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 971d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return wpas_dbus_simple_array_property_getter(iter, 972d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt DBUS_TYPE_STRING, 973d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities, 974d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt num_items, error); 975d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt} 976d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 977d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 9788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_type(DBusMessage *message, DBusMessageIter *var, 9798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **type, DBusMessage **reply) 9808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_STRING) { 9826c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s[dbus]: Type must be a string", 9836c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 9848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 9858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong Type value type. String required"); 9868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(var, type); 9898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 9908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ssids(DBusMessage *message, DBusMessageIter *var, 9948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params *params, 9958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage **reply) 9968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_ssid *ssids = params->ssids; 9988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t ssids_num = 0; 9998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *ssid; 10008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter array_iter, sub_array_iter; 10018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *val; 10028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int len; 10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) { 10056c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 10066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: ssids must be an array of arrays of bytes", 10076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 10106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Wrong SSIDs value type. Array of arrays of bytes required"); 10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(var, &array_iter); 10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY || 10176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE) { 10186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 10196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: ssids must be an array of arrays of bytes", 10206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 10236c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Wrong SSIDs value type. Array of arrays of bytes required"); 10248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY) { 10288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssids_num >= WPAS_MAX_SCAN_SSIDS) { 10296c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 10306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: Too many ssids specified on scan dbus call", 10316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 10328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 10346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Too many ssids specified. Specify at most four"); 10358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&array_iter, &sub_array_iter); 10398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len); 10418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10429d9e60286e05ae45025b672636490bd12586138dDmitry Shmidt if (len > SSID_MAX_LEN) { 1043c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt wpa_printf(MSG_DEBUG, 10446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: SSID too long (len=%d max_len=%d)", 10459d9e60286e05ae45025b672636490bd12586138dDmitry Shmidt __func__, len, SSID_MAX_LEN); 1046c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 1047c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt message, "Invalid SSID: too long"); 1048c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return -1; 1049c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt } 1050c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 10518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (len != 0) { 10528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = os_malloc(len); 10538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 10546c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt *reply = wpas_dbus_error_no_memory(message); 10558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(ssid, val, len); 10588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 10598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Allow zero-length SSIDs */ 10608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = NULL; 10618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssids[ssids_num].ssid = ssid; 10648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssids[ssids_num].ssid_len = len; 10658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssids_num++; 10688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->num_ssids = ssids_num; 10718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 10728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ies(DBusMessage *message, DBusMessageIter *var, 10768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params *params, 10778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage **reply) 10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *ies = NULL, *nies; 10808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ies_len = 0; 10818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter array_iter, sub_array_iter; 10828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *val; 10838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int len; 10848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) { 10866c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 10876c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: ies must be an array of arrays of bytes", 10886c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 10898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 10916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Wrong IEs value type. Array of arrays of bytes required"); 10928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(var, &array_iter); 10968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY || 10986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE) { 10996c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 11006c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: ies must be an array of arrays of bytes", 11016c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 11028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong IEs value type. Array required"); 11048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY) { 11088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&array_iter, &sub_array_iter); 11098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len); 11118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (len == 0) { 11128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 11138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 11148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nies = os_realloc(ies, ies_len + len); 11178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nies == NULL) { 11188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ies); 11196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt *reply = wpas_dbus_error_no_memory(message); 11208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ies = nies; 11238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(ies + ies_len, val, len); 11248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ies_len += len; 11258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 11278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->extra_ies = ies; 11308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->extra_ies_len = ies_len; 11318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 11328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 11338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_channels(DBusMessage *message, 11368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter *var, 11378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params *params, 11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage **reply) 11398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 11408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter array_iter, sub_array_iter; 11418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int *freqs = NULL, *nfreqs; 11428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int freqs_num = 0; 11438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) { 11456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 11466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: Channels must be an array of structs", 11476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 11488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 11506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Wrong Channels value type. Array of structs required"); 11518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(var, &array_iter); 11558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_STRUCT) { 11578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, 11586c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: Channels must be an array of structs", 11596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 11608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 11626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Wrong Channels value type. Array of structs required"); 11638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_STRUCT) 11678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 11688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int freq, width; 11698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&array_iter, &sub_array_iter); 11718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&sub_array_iter) != 11738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_UINT32) { 11746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 11756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: Channel must by specified by struct of two UINT32s %c", 11766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__, 11778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_arg_type( 11788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &sub_array_iter)); 11798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11806c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 11816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Wrong Channel struct. Two UINT32s required"); 11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 11838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&sub_array_iter, &freq); 11868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_next(&sub_array_iter) || 11888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_arg_type(&sub_array_iter) != 11898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_UINT32) { 11906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 11916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: Channel must by specified by struct of two UINT32s", 11926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 11938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, 11958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Wrong Channel struct. Two UINT32s required"); 11968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 11978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&sub_array_iter, &width); 12018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define FREQS_ALLOC_CHUNK 32 12038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (freqs_num % FREQS_ALLOC_CHUNK == 0) { 120461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt nfreqs = os_realloc_array( 120561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt freqs, freqs_num + FREQS_ALLOC_CHUNK, 120661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt sizeof(int)); 12078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nfreqs == NULL) 12088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 12098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs = nfreqs; 12108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (freqs == NULL) { 12126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt *reply = wpas_dbus_error_no_memory(message); 12138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs[freqs_num] = freq; 12178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs_num++; 12198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 12208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 122261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt nfreqs = os_realloc_array(freqs, freqs_num + 1, sizeof(int)); 12238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nfreqs == NULL) 12248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 12258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs = nfreqs; 12268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (freqs == NULL) { 12276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt *reply = wpas_dbus_error_no_memory(message); 12288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs[freqs_num] = 0; 12318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->freqs = freqs; 12338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 12348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 12358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1237051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidtstatic int wpas_dbus_get_scan_allow_roam(DBusMessage *message, 1238051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt DBusMessageIter *var, 1239051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt dbus_bool_t *allow, 1240051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt DBusMessage **reply) 1241051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt{ 1242051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_BOOLEAN) { 12436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s[dbus]: Type must be a boolean", 12446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 1245051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 1246051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt message, "Wrong Type value type. Boolean required"); 1247051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt return -1; 1248051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt } 1249051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt dbus_message_iter_get_basic(var, allow); 1250051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt return 0; 1251051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt} 1252051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 1253051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 12548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 12558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_scan - Request a wireless scan on an interface 12568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 12578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 12588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL indicating success or DBus error message on failure 12598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 12608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Scan" method call of a network device. Requests 12618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * that wpa_supplicant perform a wireless scan as soon as possible 12628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * on a particular wireless interface. 12638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 12648d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_scan(DBusMessage *message, 12658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 12668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 12678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 12688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, dict_iter, entry_iter, variant_iter; 12698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *key = NULL, *type = NULL; 12708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params params; 12718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t i; 1272051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt dbus_bool_t allow_roam = 1; 12738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(¶ms, 0, sizeof(params)); 12758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 12778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&iter, &dict_iter); 12798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dbus_message_iter_get_arg_type(&dict_iter) == 12816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt DBUS_TYPE_DICT_ENTRY) { 12828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&dict_iter, &entry_iter); 12838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&entry_iter, &key); 12848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&entry_iter); 12858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&entry_iter, &variant_iter); 12868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(key, "Type") == 0) { 12888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_type(message, &variant_iter, 12898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &type, &reply) < 0) 12908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 12918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(key, "SSIDs") == 0) { 12928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_ssids(message, &variant_iter, 12938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ¶ms, &reply) < 0) 12948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 12958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(key, "IEs") == 0) { 12968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_ies(message, &variant_iter, 12978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ¶ms, &reply) < 0) 12988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 12998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(key, "Channels") == 0) { 13008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_channels(message, &variant_iter, 13018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ¶ms, &reply) < 0) 13028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 1303051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt } else if (os_strcmp(key, "AllowRoam") == 0) { 1304051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt if (wpas_dbus_get_scan_allow_roam(message, 1305051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt &variant_iter, 1306051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt &allow_roam, 1307051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt &reply) < 0) 1308051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt goto out; 13098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 13106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s[dbus]: Unknown argument %s", 13116c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__, key); 13128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, key); 13138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&dict_iter); 13178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!type) { 13206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s[dbus]: Scan type not specified", 13216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 13228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, key); 13238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_strcmp(type, "passive") == 0) { 13278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (params.num_ssids || params.extra_ies_len) { 13286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 13296c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: SSIDs or IEs specified for passive scan.", 13306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 13318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args( 13326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 13336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "You can specify only Channels in passive scan"); 13348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 1336cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s->sched_scanning) { 1337cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt wpa_printf(MSG_DEBUG, 1338cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt "%s[dbus]: Stop ongoing sched_scan to allow requested scan to proceed", 1339cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt __func__); 1340cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt wpa_supplicant_cancel_sched_scan(wpa_s); 1341cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } 1342cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt 1343cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (params.freqs && params.freqs[0]) { 1344cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_supplicant_trigger_scan(wpa_s, 1345cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt ¶ms)) { 1346cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt reply = wpas_dbus_error_scan_error( 1347cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt message, 1348cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt "Scan request rejected"); 1349cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } 1350cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } else { 1351cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt wpa_s->scan_req = MANUAL_SCAN_REQ; 1352cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt wpa_supplicant_req_scan(wpa_s, 0, 0); 1353cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } 13548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13556c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt } else if (os_strcmp(type, "active") == 0) { 13568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!params.num_ssids) { 13578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Add wildcard ssid */ 13588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.num_ssids++; 13598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 136004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN 136104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt autoscan_deinit(wpa_s); 136204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */ 1363cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s->sched_scanning) { 1364cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt wpa_printf(MSG_DEBUG, 1365cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt "%s[dbus]: Stop ongoing sched_scan to allow requested scan to proceed", 1366cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt __func__); 1367cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt wpa_supplicant_cancel_sched_scan(wpa_s); 1368cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } 1369cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt 13707dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt if (wpa_supplicant_trigger_scan(wpa_s, ¶ms)) { 13717dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt reply = wpas_dbus_error_scan_error( 13727dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt message, "Scan request rejected"); 13737dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt } 13748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 13756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s[dbus]: Unknown scan type: %s", 13766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__, type); 13778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, 13788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Wrong scan type"); 13798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1382051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt if (!allow_roam) 1383051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt wpa_s->scan_res_handler = scan_only_handler; 1384051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 13858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 13868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < WPAS_MAX_SCAN_SSIDS; i++) 13878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free((u8 *) params.ssids[i].ssid); 13888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free((u8 *) params.extra_ies); 13898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(params.freqs); 13908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 13918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 13928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1394661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt/** 1395661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * wpas_dbus_handler_signal_poll - Request immediate signal properties 1396661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @message: Pointer to incoming dbus message 1397661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 1398661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Returns: NULL indicating success or DBus error message on failure 1399661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * 1400661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Handler function for "SignalPoll" method call of a network device. Requests 1401661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * that wpa_supplicant read signal properties like RSSI, noise, and link 1402661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * speed and return them. 1403661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt */ 1404661b4f78e48c697429dc46154a4125892c001718Dmitry ShmidtDBusMessage * wpas_dbus_handler_signal_poll(DBusMessage *message, 1405661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt struct wpa_supplicant *wpa_s) 1406661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt{ 1407661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt struct wpa_signal_info si; 1408661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt DBusMessage *reply = NULL; 1409661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt DBusMessageIter iter, iter_dict, variant_iter; 1410661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt int ret; 1411661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1412661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt ret = wpa_drv_signal_poll(wpa_s, &si); 1413661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (ret) { 1414661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_FAILED, 1415661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt "Failed to read signal"); 1416661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt } 1417661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1418661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt reply = dbus_message_new_method_return(message); 1419661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (reply == NULL) 1420661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt goto nomem; 1421661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1422661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt dbus_message_iter_init_append(reply, &iter); 1423661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1424661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT, 14256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "a{sv}", &variant_iter) || 14266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_open_write(&variant_iter, &iter_dict) || 14276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_append_int32(&iter_dict, "rssi", 14286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt si.current_signal) || 14296c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_append_int32(&iter_dict, "linkspeed", 14306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt si.current_txrate / 1000) || 14316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_append_int32(&iter_dict, "noise", 14326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt si.current_noise) || 14336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_append_uint32(&iter_dict, "frequency", 14346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt si.frequency) || 14356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (si.chanwidth != CHAN_WIDTH_UNKNOWN && 14366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_append_string( 14376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_dict, "width", 14386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt channel_width_to_string(si.chanwidth))) || 14396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (si.center_frq1 > 0 && si.center_frq2 > 0 && 14406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (!wpa_dbus_dict_append_int32(&iter_dict, "center-frq1", 14416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt si.center_frq1) || 14426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_append_int32(&iter_dict, "center-frq2", 14436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt si.center_frq2))) || 14446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (si.avg_signal && 14456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_append_int32(&iter_dict, "avg-rssi", 14466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt si.avg_signal)) || 14476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_close_write(&variant_iter, &iter_dict) || 14486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(&iter, &variant_iter)) 1449661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt goto nomem; 1450661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1451661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt return reply; 1452661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1453661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidtnomem: 1454661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (reply) 1455661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt dbus_message_unref(reply); 14566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpas_dbus_error_no_memory(message); 1457661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt} 1458661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1459661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 14608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 14618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_disconnect - Terminate the current connection 14628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 14638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 14648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NotConnected DBus error message if already not connected 14658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or NULL otherwise. 14668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 14678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Disconnect" method call of network interface. 14688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 14698d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_disconnect(DBusMessage *message, 14708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 14718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 14728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->current_ssid != NULL) { 14738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->disconnected = 1; 14748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_deauthenticate(wpa_s, 14758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WLAN_REASON_DEAUTH_LEAVING); 14768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 14788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_NOT_CONNECTED, 14818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "This interface is not connected"); 14828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 14838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 14868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_add_network - Add a new configured network 14878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 14888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 14898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing the object path of the new network 14908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 14918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "AddNetwork" method call of a network interface. 14928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 14938d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_network(DBusMessage *message, 14948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 14958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 14968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 14978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter; 14988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid = NULL; 14998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *path = path_buf; 15001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError error; 15018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 15038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1504cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s->dbus_new_path) 1505cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt ssid = wpa_config_add_network(wpa_s->conf); 15068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 15076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_ERROR, "%s[dbus]: can't add new interface.", 15086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 15098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_unknown_error( 15108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, 15116c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "wpa_supplicant could not add a network on this interface."); 15128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 15138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_added(wpa_s, ssid); 15158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid->disabled = 1; 15168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_set_network_defaults(ssid); 15178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_error_init(&error); 15191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!set_network_properties(wpa_s, ssid, &iter, &error)) { 15206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 15216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: control interface couldn't set network properties", 15226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 15231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_reply_new_from_error(message, &error, 15241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_ERROR_INVALID_ARGS, 15251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "Failed to add network"); 15261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_error_free(&error); 15278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 15288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Construct the object path for this network. */ 15318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX, 15328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d", 15338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, ssid->id); 15348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 15368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply == NULL) { 15376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = wpas_dbus_error_no_memory(message); 15388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 15398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path, 15418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID)) { 15428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 15436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = wpas_dbus_error_no_memory(message); 15448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 15458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 15488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr: 15508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid) { 15518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_removed(wpa_s, ssid); 15528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_remove_network(wpa_s->conf, ssid->id); 15538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 15558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 15568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1559413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt * wpas_dbus_handler_reassociate - Reassociate 156061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * @message: Pointer to incoming dbus message 156161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 1562413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt * Returns: InterfaceDisabled DBus error message if disabled 156361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * or NULL otherwise. 156461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * 156561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * Handler function for "Reassociate" method call of network interface. 156661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt */ 156761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtDBusMessage * wpas_dbus_handler_reassociate(DBusMessage *message, 156861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt struct wpa_supplicant *wpa_s) 156961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 1570413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt if (wpa_s->wpa_state != WPA_INTERFACE_DISABLED) { 1571d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt wpas_request_connection(wpa_s); 157261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return NULL; 157361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 157461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 1575413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_IFACE_DISABLED, 1576413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt "This interface is disabled"); 157761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 157861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 157961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 158061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt/** 15819866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * wpas_dbus_handler_reattach - Reattach to current AP 15829866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * @message: Pointer to incoming dbus message 15839866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 15849866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * Returns: NotConnected DBus error message if not connected 15859866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * or NULL otherwise. 15869866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * 15879866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * Handler function for "Reattach" method call of network interface. 15889866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt */ 15899866086a955d00e237cc8df3722e7dff75c02532Dmitry ShmidtDBusMessage * wpas_dbus_handler_reattach(DBusMessage *message, 15909866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt struct wpa_supplicant *wpa_s) 15919866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt{ 15929866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt if (wpa_s->current_ssid != NULL) { 15939866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt wpa_s->reattach = 1; 15949866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt wpas_request_connection(wpa_s); 15959866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt return NULL; 15969866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt } 15979866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt 15989866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_NOT_CONNECTED, 15999866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt "This interface is not connected"); 16009866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt} 16019866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt 16029866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt 16039866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt/** 16048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_network - Remove a configured network 16058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 16068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 16078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure 16088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 16098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveNetwork" method call of a network interface. 16108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 16118d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_network(DBusMessage *message, 16128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 16138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 16148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 16158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *op; 16166c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt char *iface, *net_id; 16178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int id; 16188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 16192f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt int was_disabled; 16208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op, 16228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 16238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Extract the network ID and ensure the network */ 16258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* is actually a child of this interface */ 16266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt iface = wpas_dbus_new_decompose_object_path(op, 16276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt WPAS_DBUS_NEW_NETWORKS_PART, 16286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &net_id); 1629cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (iface == NULL || net_id == NULL || !wpa_s->dbus_new_path || 1630d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt os_strcmp(iface, wpa_s->dbus_new_path) != 0) { 16318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 16328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 16338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1635d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt errno = 0; 16368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt id = strtoul(net_id, NULL, 10); 1637d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (errno != 0) { 16388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 16398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 16408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 16438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 16448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_network_unknown(message); 16458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 16468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16482f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt was_disabled = ssid->disabled; 16492f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 16508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_removed(wpa_s, ssid); 16518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == wpa_s->current_ssid) 16538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_deauthenticate(wpa_s, 16548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WLAN_REASON_DEAUTH_LEAVING); 16552f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt else if (!was_disabled && wpa_s->sched_scanning) { 16566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 16576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Stop ongoing sched_scan to remove network from filters"); 16582f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt wpa_supplicant_cancel_sched_scan(wpa_s); 16592f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt wpa_supplicant_req_scan(wpa_s, 0, 0); 16602f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt } 16612f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 1662684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt if (wpa_config_remove_network(wpa_s->conf, id) < 0) { 1663684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt wpa_printf(MSG_ERROR, 16646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: error occurred when removing network %d", 16656c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__, id); 1666684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt reply = wpas_dbus_error_unknown_error( 16676c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 16686c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "error removing the specified network on is interface."); 1669684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt goto out; 1670684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt } 16718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 16738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(iface); 16748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 16758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 16768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void remove_network(void *arg, struct wpa_ssid *ssid) 16798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 16808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = arg; 16818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_removed(wpa_s, ssid); 16838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_remove_network(wpa_s->conf, ssid->id) < 0) { 16858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, 16866c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: error occurred when removing network %d", 16876c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__, ssid->id); 16888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 16898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == wpa_s->current_ssid) 1692d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt wpa_supplicant_deauthenticate(wpa_s, 1693d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt WLAN_REASON_DEAUTH_LEAVING); 16948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 16958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 16988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_all_networks - Remove all configured networks 16998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 17008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 17018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure 17028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 17038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveAllNetworks" method call of a network interface. 17048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 17058d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_all_networks( 17068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *message, struct wpa_supplicant *wpa_s) 17078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17082f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt if (wpa_s->sched_scanning) 17092f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt wpa_supplicant_cancel_sched_scan(wpa_s); 17102f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 17118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* NB: could check for failure and return an error */ 17128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_foreach_network(wpa_s->conf, remove_network, wpa_s); 17138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 17148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 17188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_select_network - Attempt association with a network 17198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 17208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 17218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure 17228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 17238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "SelectNetwork" method call of network interface. 17248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 17258d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_select_network(DBusMessage *message, 17268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 17278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 17298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *op; 17306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt char *iface, *net_id; 17318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int id; 17328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 17338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op, 17358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 17368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Extract the network ID and ensure the network */ 17388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* is actually a child of this interface */ 17396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt iface = wpas_dbus_new_decompose_object_path(op, 17406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt WPAS_DBUS_NEW_NETWORKS_PART, 17416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &net_id); 1742cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (iface == NULL || net_id == NULL || !wpa_s->dbus_new_path || 1743d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt os_strcmp(iface, wpa_s->dbus_new_path) != 0) { 17448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 17458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 17468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1748d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt errno = 0; 17498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt id = strtoul(net_id, NULL, 10); 1750d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (errno != 0) { 17518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 17528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 17538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 17568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 17578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_network_unknown(message); 17588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 17598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Finally, associate with the network */ 17628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_select_network(wpa_s, ssid); 17638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 17658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(iface); 17668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 17678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 17711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * wpas_dbus_handler_network_reply - Reply to a NetworkRequest signal 17721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @message: Pointer to incoming dbus message 17731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 17741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: NULL on success or dbus error on failure 17751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * 17761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Handler function for "NetworkReply" method call of network interface. 17771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt */ 17781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry ShmidtDBusMessage * wpas_dbus_handler_network_reply(DBusMessage *message, 17791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s) 17801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 17811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef IEEE8021X_EAPOL 17821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessage *reply = NULL; 17831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const char *op, *field, *value; 17846c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt char *iface, *net_id; 17851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int id; 17861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_ssid *ssid; 17871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 17881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_get_args(message, NULL, 17896c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt DBUS_TYPE_OBJECT_PATH, &op, 17906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt DBUS_TYPE_STRING, &field, 17916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt DBUS_TYPE_STRING, &value, 17926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt DBUS_TYPE_INVALID)) 17931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_error_invalid_args(message, NULL); 17941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 17951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Extract the network ID and ensure the network */ 17961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* is actually a child of this interface */ 17976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt iface = wpas_dbus_new_decompose_object_path(op, 17986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt WPAS_DBUS_NEW_NETWORKS_PART, 17996c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &net_id); 1800cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (iface == NULL || net_id == NULL || !wpa_s->dbus_new_path || 1801d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt os_strcmp(iface, wpa_s->dbus_new_path) != 0) { 18021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 18031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto out; 18041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 18051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1806d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt errno = 0; 18071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt id = strtoul(net_id, NULL, 10); 1808d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (errno != 0) { 18091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_error_invalid_args(message, net_id); 18101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto out; 18111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 18121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 18131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 18141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (ssid == NULL) { 18151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_error_network_unknown(message); 18161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto out; 18171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 18181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 18191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (wpa_supplicant_ctrl_iface_ctrl_rsp_handle(wpa_s, ssid, 18201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt field, value) < 0) 18211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_error_invalid_args(message, field); 18221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt else { 18231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Tell EAP to retry immediately */ 18241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt eapol_sm_notify_ctrl_response(wpa_s->eapol); 18251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 18261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 18271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtout: 18281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(iface); 18291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return reply; 18301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#else /* IEEE8021X_EAPOL */ 18311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: 802.1X not included"); 18321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_error_unknown_error(message, "802.1X not included"); 18331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* IEEE8021X_EAPOL */ 18341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 18351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 18361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1837700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_BLOBS 1838700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt 18391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/** 18408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_add_blob - Store named binary blob (ie, for certificates) 18418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 18428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 18438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing an error on failure or NULL on success 18448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 18458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally store a binary blobs. 18468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 18478d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_blob(DBusMessage *message, 18488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 18498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 18518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, array_iter; 18528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *blob_name; 18548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *blob_data; 18558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int blob_len; 18568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_config_blob *blob = NULL; 18578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 18598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&iter, &blob_name); 18608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_get_blob(wpa_s->conf, blob_name)) { 18628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, 18638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPAS_DBUS_ERROR_BLOB_EXISTS, 18648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 18658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&iter); 18688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&iter, &array_iter); 18698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_fixed_array(&array_iter, &blob_data, &blob_len); 18718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = os_zalloc(sizeof(*blob)); 18738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!blob) { 18746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = wpas_dbus_error_no_memory(message); 18758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 18768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->data = os_malloc(blob_len); 18796c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt blob->name = os_strdup(blob_name); 18806c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!blob->data || !blob->name) { 18816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = wpas_dbus_error_no_memory(message); 18828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 18838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(blob->data, blob_data, blob_len); 18858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->len = blob_len; 18868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_set_blob(wpa_s->conf, blob); 18888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_blob_added(wpa_s, blob->name); 18898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 18918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr: 18938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (blob) { 18948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(blob->name); 18958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(blob->data); 18968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(blob); 18978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 18998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 19008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 19038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_blob - Get named binary blob (ie, for certificates) 19048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 19058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 19068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing array of bytes (blob) 19078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 19088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Gets one wpa_supplicant's binary blobs. 19098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 19108d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_blob(DBusMessage *message, 19118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 19128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 19138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 19148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, array_iter; 19158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *blob_name; 19178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct wpa_config_blob *blob; 19188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name, 19208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 19218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = wpa_config_get_blob(wpa_s->conf, blob_name); 19238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!blob) { 19248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, 19258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPAS_DBUS_ERROR_BLOB_UNKNOWN, 19268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Blob id not set"); 19278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 19306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!reply) 19316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpas_dbus_error_no_memory(message); 19328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init_append(reply, &iter); 19348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, 19368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_BYTE_AS_STRING, 19376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &array_iter) || 19386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_append_fixed_array(&array_iter, DBUS_TYPE_BYTE, 19396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &(blob->data), blob->len) || 19406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(&iter, &array_iter)) { 19418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 19426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = wpas_dbus_error_no_memory(message); 19438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 19468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 19478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 19508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_remove_handler_remove_blob - Remove named binary blob 19518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 19528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 19538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error 19548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 19558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally remove a binary blobs. 19568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 19578d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_blob(DBusMessage *message, 19588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 19598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 19608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 19618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *blob_name; 19628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name, 19648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 19658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_remove_blob(wpa_s->conf, blob_name)) { 19678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, 19688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPAS_DBUS_ERROR_BLOB_UNKNOWN, 19698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Blob id not set"); 19708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_blob_removed(wpa_s, blob_name); 19728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 19748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 19768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1977700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_BLOBS */ 1978700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt 1979700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt 19808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 19818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_flush_bss - Flush the BSS cache 19828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 19838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 19848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL 19858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 19868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "FlushBSS" method call of network interface. 19878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 19888d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_flush_bss(DBusMessage *message, 19898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 19908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 19918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t age; 19928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_UINT32, &age, 19948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 19958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (age == 0) 19978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_bss_flush(wpa_s); 19988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 19998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_bss_flush_by_age(wpa_s, age); 20008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 20028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 20038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 200504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN 200604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 200704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_handler_autoscan - Set autoscan parameters for the interface 200804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @message: Pointer to incoming dbus message 200904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 201004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: NULL 201104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 201204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Handler function for "AutoScan" method call of network interface. 201304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 201404949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_autoscan(DBusMessage *message, 201504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_supplicant *wpa_s) 201604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 201704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessage *reply = NULL; 201804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt enum wpa_states state = wpa_s->wpa_state; 201904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *arg; 202004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 202104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &arg, 202204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBUS_TYPE_INVALID); 202304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 202404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (arg != NULL && os_strlen(arg) > 0) { 202504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *tmp; 20266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 202704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt tmp = os_strdup(arg); 202804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (tmp == NULL) { 20296c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = wpas_dbus_error_no_memory(message); 203004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else { 203104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(wpa_s->conf->autoscan); 203204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->conf->autoscan = tmp; 203304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (state == WPA_DISCONNECTED || state == WPA_INACTIVE) 203404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt autoscan_init(wpa_s, 1); 203504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt else if (state == WPA_SCANNING) 203604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_supplicant_reinit_autoscan(wpa_s); 203704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 203804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (arg != NULL && os_strlen(arg) == 0) { 203904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(wpa_s->conf->autoscan); 204004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->conf->autoscan = NULL; 204104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt autoscan_deinit(wpa_s); 204204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else 204304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt reply = dbus_message_new_error(message, 204404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBUS_ERROR_INVALID_ARGS, 204504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt NULL); 204604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 204704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return reply; 204804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 204904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */ 205004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 205104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 20528da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt/* 20538da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * wpas_dbus_handler_eap_logoff - IEEE 802.1X EAPOL state machine logoff 20548da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @message: Pointer to incoming dbus message 20558da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 20568da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Returns: NULL 20578da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * 20588da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Handler function for "EAPLogoff" method call of network interface. 20598da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt */ 20608da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry ShmidtDBusMessage * wpas_dbus_handler_eap_logoff(DBusMessage *message, 20618da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt struct wpa_supplicant *wpa_s) 20628da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt{ 20638da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt eapol_sm_notify_logoff(wpa_s->eapol, TRUE); 20648da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt return NULL; 20658da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt} 20668da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt 20678da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt 20688da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt/* 20698da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * wpas_dbus_handler_eap_logon - IEEE 802.1X EAPOL state machine logon 20708da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @message: Pointer to incoming dbus message 20718da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 20728da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Returns: NULL 20738da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * 20748da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Handler function for "EAPLogin" method call of network interface. 20758da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt */ 20768da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry ShmidtDBusMessage * wpas_dbus_handler_eap_logon(DBusMessage *message, 20778da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt struct wpa_supplicant *wpa_s) 20788da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt{ 20798da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt eapol_sm_notify_logoff(wpa_s->eapol, FALSE); 20808da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt return NULL; 20818da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt} 20828da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt 20838da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt 2084e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt#ifdef CONFIG_TDLS 2085e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 20867d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidtstatic int get_peer_hwaddr_helper(DBusMessage *message, const char *func_name, 20877d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt u8 *peer_address, DBusMessage **error) 2088e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 2089e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt const char *peer_string; 2090e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 20917d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt *error = NULL; 20927d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt 2093e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (!dbus_message_get_args(message, NULL, 2094e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt DBUS_TYPE_STRING, &peer_string, 20957d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt DBUS_TYPE_INVALID)) { 20967d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt *error = wpas_dbus_error_invalid_args(message, NULL); 20977d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt return -1; 20987d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt } 2099e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2100e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (hwaddr_aton(peer_string, peer_address)) { 2101e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: invalid address '%s'", 2102e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt func_name, peer_string); 21037d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt *error = wpas_dbus_error_invalid_args( 2104e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt message, "Invalid hardware address format"); 21057d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt return -1; 2106e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt } 2107e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 21087d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt return 0; 2109e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 2110e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2111e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2112e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/* 2113e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_discover - Discover TDLS peer 2114e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message 2115e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 2116e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure 2117e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * 2118e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSDiscover" method call of network interface. 2119e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */ 2120e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_discover(DBusMessage *message, 2121e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt struct wpa_supplicant *wpa_s) 2122e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 2123e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt u8 peer[ETH_ALEN]; 2124e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt DBusMessage *error_reply; 2125e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt int ret; 2126e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 21277d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0) 2128e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return error_reply; 2129e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2130e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_printf(MSG_DEBUG, "DBUS TDLS_DISCOVER " MACSTR, MAC2STR(peer)); 2131e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2132e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (wpa_tdls_is_external_setup(wpa_s->wpa)) 2133e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_tdls_send_discovery_request(wpa_s->wpa, peer); 2134e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt else 2135e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_drv_tdls_oper(wpa_s, TDLS_DISCOVERY_REQ, peer); 2136e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2137e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (ret) { 2138e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return wpas_dbus_error_unknown_error( 2139e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt message, "error performing TDLS discovery"); 2140e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt } 2141e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2142e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return NULL; 2143e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 2144e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2145e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2146e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/* 2147e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_setup - Setup TDLS session 2148e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message 2149e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 2150e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure 2151e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * 2152e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSSetup" method call of network interface. 2153e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */ 2154e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_setup(DBusMessage *message, 2155e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt struct wpa_supplicant *wpa_s) 2156e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 2157e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt u8 peer[ETH_ALEN]; 2158e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt DBusMessage *error_reply; 2159e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt int ret; 2160e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 21617d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0) 2162e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return error_reply; 2163e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2164e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_printf(MSG_DEBUG, "DBUS TDLS_SETUP " MACSTR, MAC2STR(peer)); 2165e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2166e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_tdls_remove(wpa_s->wpa, peer); 2167e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (wpa_tdls_is_external_setup(wpa_s->wpa)) 2168e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_tdls_start(wpa_s->wpa, peer); 2169e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt else 2170e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_drv_tdls_oper(wpa_s, TDLS_SETUP, peer); 2171e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2172e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (ret) { 2173e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return wpas_dbus_error_unknown_error( 2174e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt message, "error performing TDLS setup"); 2175e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt } 2176e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2177e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return NULL; 2178e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 2179e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2180e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2181e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/* 2182e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_status - Return TDLS session status 2183e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message 2184e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 2185e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: A string representing the state of the link to this TDLS peer 2186e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * 2187e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSStatus" method call of network interface. 2188e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */ 2189e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_status(DBusMessage *message, 2190e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt struct wpa_supplicant *wpa_s) 2191e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 2192e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt u8 peer[ETH_ALEN]; 2193e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt DBusMessage *reply; 2194e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt const char *tdls_status; 2195e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 21967d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt if (get_peer_hwaddr_helper(message, __func__, peer, &reply) < 0) 2197e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return reply; 2198e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2199e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_printf(MSG_DEBUG, "DBUS TDLS_STATUS " MACSTR, MAC2STR(peer)); 2200e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2201e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt tdls_status = wpa_tdls_get_link_status(wpa_s->wpa, peer); 2202e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2203e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt reply = dbus_message_new_method_return(message); 2204e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt dbus_message_append_args(reply, DBUS_TYPE_STRING, 2205e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt &tdls_status, DBUS_TYPE_INVALID); 2206e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return reply; 2207e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 2208e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2209e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2210e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/* 2211e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_teardown - Teardown TDLS session 2212e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message 2213e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 2214e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure 2215e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * 2216e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSTeardown" method call of network interface. 2217e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */ 2218e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_teardown(DBusMessage *message, 2219e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt struct wpa_supplicant *wpa_s) 2220e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 2221e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt u8 peer[ETH_ALEN]; 2222e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt DBusMessage *error_reply; 2223e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt int ret; 2224e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 22257d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0) 2226e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return error_reply; 2227e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2228e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_printf(MSG_DEBUG, "DBUS TDLS_TEARDOWN " MACSTR, MAC2STR(peer)); 2229e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2230e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (wpa_tdls_is_external_setup(wpa_s->wpa)) 2231e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_tdls_teardown_link( 2232e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_s->wpa, peer, 2233e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED); 2234e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt else 2235e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_drv_tdls_oper(wpa_s, TDLS_TEARDOWN, peer); 2236e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2237e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (ret) { 2238e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return wpas_dbus_error_unknown_error( 2239e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt message, "error performing TDLS teardown"); 2240e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt } 2241e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2242e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return NULL; 2243e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 2244e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2245e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt#endif /* CONFIG_TDLS */ 2246e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2247e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 22488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 224901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_handler_set_pkcs11_engine_and_module_path - Set PKCS #11 engine and module path 225001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @message: Pointer to incoming dbus message 225101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 225201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing an error on failure or NULL on success 225301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * 225401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Sets the PKCS #11 engine and module path. 225501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */ 225601904cfafd75a70b9f29c0220b90bdef45595491Dmitry ShmidtDBusMessage * wpas_dbus_handler_set_pkcs11_engine_and_module_path( 225701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt DBusMessage *message, struct wpa_supplicant *wpa_s) 225801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{ 225901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt DBusMessageIter iter; 226001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt char *value = NULL; 226101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt char *pkcs11_engine_path = NULL; 226201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt char *pkcs11_module_path = NULL; 226301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 226401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt dbus_message_iter_init(message, &iter); 226501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt dbus_message_iter_get_basic(&iter, &value); 226601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (value == NULL) { 226701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return dbus_message_new_error( 226801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt message, DBUS_ERROR_INVALID_ARGS, 226901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt "Invalid pkcs11_engine_path argument"); 227001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt } 227101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt /* Empty path defaults to NULL */ 227201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (os_strlen(value)) 227301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_engine_path = value; 227401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 227501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt dbus_message_iter_next(&iter); 227601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt dbus_message_iter_get_basic(&iter, &value); 227701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (value == NULL) { 227801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt os_free(pkcs11_engine_path); 227901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return dbus_message_new_error( 228001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt message, DBUS_ERROR_INVALID_ARGS, 228101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt "Invalid pkcs11_module_path argument"); 228201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt } 228301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt /* Empty path defaults to NULL */ 228401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (os_strlen(value)) 228501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_module_path = value; 228601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 228701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (wpas_set_pkcs11_engine_and_module_path(wpa_s, pkcs11_engine_path, 228801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_module_path)) 228901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return dbus_message_new_error( 229001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt message, DBUS_ERROR_FAILED, 22916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Reinit of the EAPOL state machine with the new PKCS #11 engine and module path failed."); 229201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 2293cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s->dbus_new_path) { 2294cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt wpa_dbus_mark_property_changed( 2295cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt wpa_s->global->dbus, wpa_s->dbus_new_path, 2296cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11EnginePath"); 2297cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt wpa_dbus_mark_property_changed( 2298cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt wpa_s->global->dbus, wpa_s->dbus_new_path, 2299cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11ModulePath"); 2300cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } 230101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 230201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return NULL; 230301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt} 230401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 230501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 230601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/** 23078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_capabilities - Return interface capabilities 23081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 23091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 23101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 23111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 23128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 23138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Capabilities" property of an interface. 23148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 23151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_capabilities(DBusMessageIter *iter, 23161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 23178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 23181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 23198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_capa capa; 23208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 23211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter iter_dict, iter_dict_entry, iter_dict_val, iter_array, 23228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt variant_iter; 23238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *scans[] = { "active", "passive", "ssid" }; 23248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 23266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "a{sv}", &variant_iter) || 23276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_open_write(&variant_iter, &iter_dict)) 23288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 23298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = wpa_drv_get_capa(wpa_s, &capa); 23318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** pairwise cipher */ 23338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 23348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = {"ccmp", "tkip", "none"}; 23356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 23368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 23378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "Pairwise", args, 233868d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(args))) 23398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 23408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 23418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Pairwise", 23428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 23438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 23446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array) || 23456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP_256) && 23466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "ccmp-256")) || 23486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP_256) && 23496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "gcmp-256")) || 23516c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) && 23526c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23536c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "ccmp")) || 23546c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP) && 23556c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "gcmp")) || 23576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) && 23586c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "tkip")) || 23606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) && 23616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "none")) || 23636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_end_string_array(&iter_dict, 23648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 23658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 23668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 23678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 23688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 23698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** group cipher */ 23718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 23728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { 23738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "ccmp", "tkip", "wep104", "wep40" 23748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }; 23756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 23768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 23778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "Group", args, 237868d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(args))) 23798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 23808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 23818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Group", 23828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 23838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 23846c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array) || 23856c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP_256) && 23866c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23876c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "ccmp-256")) || 23886c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP_256) && 23896c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "gcmp-256")) || 23916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) && 23926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23936c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "ccmp")) || 23946c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP) && 23956c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23966c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "gcmp")) || 23976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) && 23986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23996c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "tkip")) || 24006c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_WEP104) && 24016c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24026c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "wep104")) || 24036c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_WEP40) && 24046c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24056c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "wep40")) || 24066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_end_string_array(&iter_dict, 24078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 24088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 24098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 24108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** key management */ 24148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 24158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { 24168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa-psk", "wpa-eap", "ieee8021x", "wpa-none", 24178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 24188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wps", 24198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 24208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "none" 24218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }; 24228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 24238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "KeyMgmt", args, 242468d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(args))) 24258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 24278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "KeyMgmt", 24288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 24298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 24306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array) || 24316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element(&iter_array, 24326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "none") || 24336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element(&iter_array, 24348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "ieee8021x")) 24358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA | 24388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2)) { 24398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 24406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "wpa-eap") || 24416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_FT) && 24426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "wpa-ft-eap"))) 24448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */ 24478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 24488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 24498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-eap-sha256")) 24508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 24528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK | 24558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) { 24568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 24576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "wpa-psk") || 24586c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.key_mgmt & 24596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_FT_PSK) && 24606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "wpa-ft-psk"))) 24628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */ 24658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 24668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 24678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-psk-sha256")) 24688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 24708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24726c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if ((capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) && 24736c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element(&iter_array, 24746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "wpa-none")) 24756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt goto nomem; 24768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 24798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element(&iter_array, 24808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wps")) 24818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 24838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_end_string_array(&iter_dict, 24858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 24868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 24878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 24888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** WPA protocol */ 24928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 24938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { "rsn", "wpa" }; 24946c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 24958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 24968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "Protocol", args, 249768d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(args))) 24988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 25008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Protocol", 25018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 25028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 25036c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array) || 25046c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA2 | 25056c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) && 25066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 25076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "rsn")) || 25086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA | 25096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK)) && 25106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 25116c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "wpa")) || 25126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_end_string_array(&iter_dict, 25138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 25148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 25158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 25168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** auth alg */ 25208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 25218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { "open", "shared", "leap" }; 25226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 25238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 25248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "AuthAlg", args, 252568d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(args))) 25268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 25288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "AuthAlg", 25298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 25308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 25318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 25328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (((capa.auth & WPA_DRIVER_AUTH_OPEN) && 25356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 25366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "open")) || 25376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.auth & WPA_DRIVER_AUTH_SHARED) && 25386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 25396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "shared")) || 25406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.auth & WPA_DRIVER_AUTH_LEAP) && 25416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 25426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "leap")) || 25436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_end_string_array(&iter_dict, 25448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 25458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 25468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 25478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** Scan */ 25518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array(&iter_dict, "Scan", scans, 255268d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(scans))) 25538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** Modes */ 255675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Modes", 255775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_entry, 255875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_val, 25596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array) || 25606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 25616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "infrastructure") || 25626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 25636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "ad-hoc") || 25646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (res >= 0 && (capa.flags & WPA_DRIVER_FLAGS_AP) && 25656c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 25666c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "ap")) || 25676c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (res >= 0 && (capa.flags & WPA_DRIVER_FLAGS_P2P_CAPABLE) && 25686c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 25696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "p2p")) || 25706c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_end_string_array(&iter_dict, 257175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_entry, 257275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_val, 257375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_array)) 257475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen goto nomem; 257575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen /***** Modes end */ 257675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen 25771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (res >= 0) { 25781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_int32_t max_scan_ssid = capa.max_scan_ssids; 25791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 25801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpa_dbus_dict_append_int32(&iter_dict, "MaxScanSSID", 25811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt max_scan_ssid)) 25821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto nomem; 25831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 25841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 25856c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict) || 25866c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) 25878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 25908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem: 25921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 25931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 25948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 25958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 25988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_state - Get interface state 25991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 26001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 26011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 26021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 26038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 26048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "State" property. 26058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 26061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_state(DBusMessageIter *iter, DBusError *error, 26071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 26088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 26091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 26108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *str_state; 26118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *state_ls, *tmp; 26121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 26138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt str_state = wpa_supplicant_state_txt(wpa_s->wpa_state); 26158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* make state string lowercase to fit new DBus API convention 26178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 26188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt state_ls = tmp = os_strdup(str_state); 26198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!tmp) { 26201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 26211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 26228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*tmp) { 26248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *tmp = tolower(*tmp); 26258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tmp++; 26268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 26291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &state_ls, error); 26308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(state_ls); 26328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 26348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 26358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 26388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_get_scanning - Get interface scanning state 26391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 26401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 26411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 26421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 26438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 26448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "scanning" property. 26458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 26461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_scanning(DBusMessageIter *iter, DBusError *error, 26476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt void *user_data) 26488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 26491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 26508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t scanning = wpa_s->scanning ? TRUE : FALSE; 26511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 26521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 26531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &scanning, error); 26548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 26558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 26588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ap_scan - Control roaming mode 26591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 26601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 26611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 26621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 26638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 26648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "ApScan" property. 26658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 26661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_ap_scan(DBusMessageIter *iter, DBusError *error, 26671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 26688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 26691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 26708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t ap_scan = wpa_s->conf->ap_scan; 26711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 26721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, 26731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &ap_scan, error); 26748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 26758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 26788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_ap_scan - Control roaming mode 26791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 26801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 26811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 26821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 26838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 26848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "ApScan" property. 26858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 26861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_ap_scan(DBusMessageIter *iter, DBusError *error, 26871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 26888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 26891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 26908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t ap_scan; 26918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32, 26931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &ap_scan)) 26941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 26958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_set_ap_scan(wpa_s, ap_scan)) { 26971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 26981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "ap_scan must be 0, 1, or 2"); 26991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 27008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 27011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 27028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 2706c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * wpas_dbus_getter_fast_reauth - Control fast 2707c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * reauthentication (TLS session resumption) 2708c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 2709c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @error: Location to store error on failure 2710c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @user_data: Function specific data 2711c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Returns: TRUE on success, FALSE on failure 2712c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * 2713c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Getter function for "FastReauth" property. 2714c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt */ 2715c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidtdbus_bool_t wpas_dbus_getter_fast_reauth(DBusMessageIter *iter, 2716c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt DBusError *error, 2717c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt void *user_data) 2718c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt{ 2719c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 2720c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt dbus_bool_t fast_reauth = wpa_s->conf->fast_reauth ? TRUE : FALSE; 2721c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2722c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 2723c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt &fast_reauth, error); 2724c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt} 2725c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2726c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2727c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt/** 2728c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * wpas_dbus_setter_fast_reauth - Control fast 2729c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * reauthentication (TLS session resumption) 2730c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 2731c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @error: Location to store error on failure 2732c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @user_data: Function specific data 2733c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Returns: TRUE on success, FALSE on failure 2734c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * 2735c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Setter function for "FastReauth" property. 2736c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt */ 2737c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidtdbus_bool_t wpas_dbus_setter_fast_reauth(DBusMessageIter *iter, 2738c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt DBusError *error, 2739c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt void *user_data) 2740c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt{ 2741c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 2742c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt dbus_bool_t fast_reauth; 2743c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2744c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, 2745c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt &fast_reauth)) 2746c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return FALSE; 2747c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2748c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt wpa_s->conf->fast_reauth = fast_reauth; 2749c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return TRUE; 2750c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt} 2751c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2752c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2753c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt/** 275404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_getter_disconnect_reason - Get most recent reason for disconnect 275504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 275604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure 275704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data 275804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 275904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 276004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Getter for "DisconnectReason" property. The reason is negative if it is 276104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * locally generated. 276204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 276304949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_getter_disconnect_reason(DBusMessageIter *iter, 276404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusError *error, 276504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt void *user_data) 276604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 276704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 276804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_int32_t reason = wpa_s->disconnect_reason; 27696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 277004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32, 277104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt &reason, error); 277204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 277304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 277404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 277504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 27768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_age - Get BSS entry expiration age 27771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 27781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 27791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 27801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 27818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 27828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "BSSExpireAge" property. 27838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 27841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_expire_age(DBusMessageIter *iter, 27851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 27861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 27878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 27881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 27898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t expire_age = wpa_s->conf->bss_expiration_age; 27901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 27911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, 27921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &expire_age, error); 27938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 27978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_age - Control BSS entry expiration age 27981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 27991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 28001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 28011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 28028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 28038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "BSSExpireAge" property. 28048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 28051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_bss_expire_age(DBusMessageIter *iter, 28061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 28071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 28088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 28091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 28108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t expire_age; 28118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32, 28131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &expire_age)) 28141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 28158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_set_bss_expiration_age(wpa_s, expire_age)) { 28171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 28181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "BSSExpireAge must be >= 10"); 28191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 28208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 28211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 28228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 28238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 28268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_count - Get BSS entry expiration scan count 28271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 28281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 28291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 28301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 28318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 28328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "BSSExpireCount" property. 28338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 28341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_expire_count(DBusMessageIter *iter, 28351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 28361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 28378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 28381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 283961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt dbus_uint32_t expire_count = wpa_s->conf->bss_expiration_scan_count; 28401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 28411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, 28421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &expire_count, error); 28438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 28448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 28478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_count - Control BSS entry expiration scan count 28481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 28491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 28501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 28511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 28528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 28538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "BSSExpireCount" property. 28548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 28551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_bss_expire_count(DBusMessageIter *iter, 28561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 28571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 28588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 28591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 28608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t expire_count; 28618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32, 28631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &expire_count)) 28641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 28658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_set_bss_expiration_count(wpa_s, expire_count)) { 28671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 28681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "BSSExpireCount must be > 0"); 28691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 28708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 28711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 28728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 28738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 28768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_country - Control country code 28771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 28781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 28791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 28801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 28818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 28828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "Country" property. 28838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 28841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_country(DBusMessageIter *iter, DBusError *error, 28851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 28868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 28871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 28888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char country[3]; 28898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *str = country; 28908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt country[0] = wpa_s->conf->country[0]; 28928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt country[1] = wpa_s->conf->country[1]; 28938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt country[2] = '\0'; 28948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 28961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &str, error); 28978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 28988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 29018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_country - Control country code 29021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 29031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 29041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 29051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 29068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 29078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "Country" property. 29088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 29091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_country(DBusMessageIter *iter, DBusError *error, 29101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 29118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 29121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 29138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *country; 29148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING, 29161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &country)) 29171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 29188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!country[0] || !country[1]) { 29201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 29211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "invalid country code"); 29221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 29231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 29248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->drv_priv != NULL && wpa_drv_set_country(wpa_s, country)) { 29268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "Failed to set country"); 29271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 29281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "failed to set country code"); 29291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 29308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 29318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->conf->country[0] = country[0]; 29338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->conf->country[1] = country[1]; 29341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 29358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 29368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 293904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_getter_scan_interval - Get scan interval 294004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 294104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure 294204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data 294304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 294404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 294504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Getter function for "ScanInterval" property. 294604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 294704949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_getter_scan_interval(DBusMessageIter *iter, 294804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusError *error, 294904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt void *user_data) 295004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 295104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 295204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_int32_t scan_interval = wpa_s->scan_interval; 295304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 295404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32, 295504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt &scan_interval, error); 295604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 295704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 295804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 295904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 296004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_setter_scan_interval - Control scan interval 296104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 296204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure 296304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data 296404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 296504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 296604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Setter function for "ScanInterval" property. 296704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 296804949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_setter_scan_interval(DBusMessageIter *iter, 296904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusError *error, 297004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt void *user_data) 297104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 297204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 297304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_int32_t scan_interval; 297404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 297504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_INT32, 297604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt &scan_interval)) 297704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 297804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 297904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_supplicant_set_scan_interval(wpa_s, scan_interval)) { 298004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 298104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "scan_interval must be >= 0"); 298204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 298304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 298404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return TRUE; 298504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 298604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 298704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 298804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 29898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ifname - Get interface name 29901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 29911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 29921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 29931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 29948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 29958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Ifname" property. 29968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 29971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_ifname(DBusMessageIter *iter, DBusError *error, 29981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 29998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 30018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *ifname = wpa_s->ifname; 30021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 30031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 30041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &ifname, error); 30058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 30098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_driver - Get interface name 30101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 30111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 30121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 30131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 30148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 30158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Driver" property. 30168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 30171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_driver(DBusMessageIter *iter, DBusError *error, 30181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 30198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 30218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *driver; 30228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->driver == NULL || wpa_s->driver->name == NULL) { 30246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s[dbus]: wpa_s has no driver set", 30256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 30261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, "%s: no driver set", 30271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt __func__); 30281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 30298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 30308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt driver = wpa_s->driver->name; 30321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 30331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &driver, error); 30348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 30388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_bss - Get current bss object path 30391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 30401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 30411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 30421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 30438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 30448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentBSS" property. 30458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 30461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_bss(DBusMessageIter *iter, 30471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 30481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 30498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 30518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *bss_obj_path = path_buf; 30528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3053cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s->current_bss && wpa_s->dbus_new_path) 30548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, 30558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u", 30568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, wpa_s->current_bss->id); 30578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 30588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/"); 30598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_OBJECT_PATH, 30611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &bss_obj_path, error); 30628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 30668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_network - Get current network object path 30671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 30681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 30691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 30701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 30718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 30728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentNetwork" property. 30738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 30741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_network(DBusMessageIter *iter, 30751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 30761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 30778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 30798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *net_obj_path = path_buf; 30808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3081cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (wpa_s->current_ssid && wpa_s->dbus_new_path) 30828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, 30838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u", 30848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, wpa_s->current_ssid->id); 30858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 30868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/"); 30878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_OBJECT_PATH, 30891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &net_obj_path, error); 30908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 30948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_auth_mode - Get current authentication type 30951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 30961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 30971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 30981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 30998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 31008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentAuthMode" property. 31018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 31021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_auth_mode(DBusMessageIter *iter, 31031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 31041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 31058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 31078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *eap_mode; 31088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *auth_mode; 31098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char eap_mode_buf[WPAS_DBUS_AUTH_MODE_MAX]; 31108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->wpa_state != WPA_COMPLETED) { 31128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt auth_mode = "INACTIVE"; 31138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X || 31148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) { 31158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eap_mode = wpa_supplicant_get_eap_mode(wpa_s); 31168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(eap_mode_buf, WPAS_DBUS_AUTH_MODE_MAX, 31178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "EAP-%s", eap_mode); 31188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt auth_mode = eap_mode_buf; 31198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 31218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt auth_mode = wpa_key_mgmt_txt(wpa_s->key_mgmt, 31228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->current_ssid->proto); 31238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 31248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 31261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &auth_mode, error); 31278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 31318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bridge_ifname - Get interface name 31321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 31331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 31341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 31351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 31368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 31378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BridgeIfname" property. 31388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 31391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bridge_ifname(DBusMessageIter *iter, 31401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 31411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 31428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 31441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const char *bridge_ifname = wpa_s->bridge_ifname; 31456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 31461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 31471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &bridge_ifname, error); 31488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 31528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bsss - Get array of BSSs objects 31531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 31541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 31551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 31561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 31578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 31588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSs" property. 31598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 31601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bsss(DBusMessageIter *iter, DBusError *error, 31611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 31628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 31648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_bss *bss; 31658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **paths; 31668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int i = 0; 31671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 31688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3169cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (!wpa_s->dbus_new_path) { 3170cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3171cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt "%s: no D-Bus interface", __func__); 3172cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt return FALSE; 3173cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } 3174cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt 317561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt paths = os_calloc(wpa_s->num_bss, sizeof(char *)); 31768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!paths) { 31771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 31781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 31798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 31808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Loop through scan results and append each result's object path */ 31828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dl_list_for_each(bss, &wpa_s->bss_id, struct wpa_bss, list_id) { 31838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX); 31848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (paths[i] == NULL) { 31851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, 31861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "no memory"); 31878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 31888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 31898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Construct the object path for this BSS. */ 31908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX, 31918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u", 31928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, bss->id); 31938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 31948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, 31961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_OBJECT_PATH, 31971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt paths, wpa_s->num_bss, 31981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 31998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 32018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (i) 32028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths[--i]); 32038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths); 32041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 32058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 32068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 32098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_networks - Get array of networks objects 32101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 32111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 32121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 32131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 32148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 32158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Networks" property. 32168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 32171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_networks(DBusMessageIter *iter, DBusError *error, 32181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 32198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 32201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 32218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 32228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **paths; 32238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int i = 0, num = 0; 32241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 32258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3226cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (!wpa_s->dbus_new_path) { 3227cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3228cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt "%s: no D-Bus interface", __func__); 3229cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt return FALSE; 3230cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt } 3231cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt 32328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) 323375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!network_is_persistent_group(ssid)) 323475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen num++; 32358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 323661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt paths = os_calloc(num, sizeof(char *)); 32378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!paths) { 32381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_NO_MEMORY, "no memory"); 32391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 32408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 32418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Loop through configured networks and append object path of each */ 32438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) { 324475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (network_is_persistent_group(ssid)) 324575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen continue; 32468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX); 32478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (paths[i] == NULL) { 32486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt dbus_set_error(error, DBUS_ERROR_NO_MEMORY, 32496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "no memory"); 32508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 32518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 32528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Construct the object path for this network. */ 32548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX, 32558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d", 32568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, ssid->id); 32578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 32588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, 32601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_OBJECT_PATH, 32611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt paths, num, error); 32628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 32648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (i) 32658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths[--i]); 32668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths); 32671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 32688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 32698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 327201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_getter_pkcs11_engine_path - Get PKCS #11 engine path 327301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 327401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @error: Location to store error on failure 327501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @user_data: Function specific data 327601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing the PKCS #11 engine path 327701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * 327801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Getter for "PKCS11EnginePath" property. 327901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */ 328001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidtdbus_bool_t wpas_dbus_getter_pkcs11_engine_path(DBusMessageIter *iter, 328101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt DBusError *error, 328201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt void *user_data) 328301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{ 328401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 328501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt const char *pkcs11_engine_path; 328601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 328701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (wpa_s->conf->pkcs11_engine_path == NULL) 328801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_engine_path = ""; 328901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt else 329001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_engine_path = wpa_s->conf->pkcs11_engine_path; 329101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 329201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt &pkcs11_engine_path, error); 329301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt} 329401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 329501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 329601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/** 329701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_getter_pkcs11_module_path - Get PKCS #11 module path 329801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 329901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @error: Location to store error on failure 330001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @user_data: Function specific data 330101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing the PKCS #11 module path 330201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * 330301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Getter for "PKCS11ModulePath" property. 330401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */ 330501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidtdbus_bool_t wpas_dbus_getter_pkcs11_module_path(DBusMessageIter *iter, 330601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt DBusError *error, 330701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt void *user_data) 330801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{ 330901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 331001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt const char *pkcs11_module_path; 331101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 331201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (wpa_s->conf->pkcs11_module_path == NULL) 331301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_module_path = ""; 331401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt else 331501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_module_path = wpa_s->conf->pkcs11_module_path; 331601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 331701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt &pkcs11_module_path, error); 331801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt} 331901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 332001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 332101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/** 33228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_blobs - Get all blobs defined for this interface 33231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 33241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 33251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 33261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 33278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 33288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Blobs" property. 33298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 33301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_blobs(DBusMessageIter *iter, DBusError *error, 33311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 33328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 33331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 33341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter, dict_iter, entry_iter, array_iter; 33358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_config_blob *blob; 33368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 33388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "a{say}", &variant_iter) || 33398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY, 33408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "{say}", &dict_iter)) { 33411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 33421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 33438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = wpa_s->conf->blobs; 33468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (blob) { 33478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_open_container(&dict_iter, 33488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_DICT_ENTRY, 33498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL, &entry_iter) || 33508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_append_basic(&entry_iter, 33518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_STRING, 33528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &(blob->name)) || 33538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_open_container(&entry_iter, 33548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_ARRAY, 33558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_BYTE_AS_STRING, 33568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &array_iter) || 33578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_append_fixed_array(&array_iter, 33588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_BYTE, 33598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &(blob->data), 33608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->len) || 33618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_close_container(&entry_iter, 33628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &array_iter) || 33638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_close_container(&dict_iter, 33648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &entry_iter)) { 33651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, 33661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "no memory"); 33671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 33688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = blob->next; 33718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_close_container(&variant_iter, &dict_iter) || 33741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) { 33751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 33761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 33778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 33801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 33811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 33821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 33831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic struct wpa_bss * get_bss_helper(struct bss_handler_args *args, 33841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, const char *func_name) 33851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 33861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res = wpa_bss_get_id(args->wpa_s, args->id); 33871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 33881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) { 33891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_ERROR, "%s[dbus]: no bss with id %d found", 33906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt func_name, args->id); 33911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 33921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: BSS %d not found", 33931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt func_name, args->id); 33941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 33951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 33961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return res; 33978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 33988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 34018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_bssid - Return the BSSID of a BSS 34021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 34031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 34041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 34051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 34068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 34078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSID" property. 34088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 34091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_bssid(DBusMessageIter *iter, DBusError *error, 34101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 34118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 34121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 34131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 34148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 34161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 34171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 34188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE, 34201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res->bssid, ETH_ALEN, 34211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 34228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 34238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 34268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ssid - Return the SSID of a BSS 34271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 34281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 34291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 34301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 34318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 34328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "SSID" property. 34338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 34341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_ssid(DBusMessageIter *iter, DBusError *error, 34351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 34368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 34371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 34381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 34398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 34411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 34421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 34438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE, 34451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res->ssid, res->ssid_len, 34461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 34478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 34488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 34518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_privacy - Return the privacy flag of a BSS 34521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 34531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 34541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 34551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 34568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 34578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Privacy" property. 34588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 34591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_privacy(DBusMessageIter *iter, 34601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 34618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 34621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 34631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 34648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t privacy; 34658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 34671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 34681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 34698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt privacy = (res->caps & IEEE80211_CAP_PRIVACY) ? TRUE : FALSE; 34711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 34721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &privacy, error); 34738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 34748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 34778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_mode - Return the mode of a BSS 34781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 34791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 34801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 34811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 34828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 34838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Mode" property. 34848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 34851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_mode(DBusMessageIter *iter, DBusError *error, 34861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 34878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 34881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 34891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 34908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *mode; 34918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 34931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 34941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 349576cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt if (bss_is_dmg(res)) { 349676cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt switch (res->caps & IEEE80211_CAP_DMG_MASK) { 349776cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt case IEEE80211_CAP_DMG_PBSS: 349876cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt case IEEE80211_CAP_DMG_IBSS: 349976cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt mode = "ad-hoc"; 350076cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt break; 350176cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt case IEEE80211_CAP_DMG_AP: 350276cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt mode = "infrastructure"; 350376cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt break; 350476cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt } 350576cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt } else { 350676cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt if (res->caps & IEEE80211_CAP_IBSS) 350776cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt mode = "ad-hoc"; 350876cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt else 350976cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt mode = "infrastructure"; 351076cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt } 35118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 35131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &mode, error); 35148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 35188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_level - Return the signal strength of a BSS 35191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 35201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 35211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 35221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 35238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 35248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Level" property. 35258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 35261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_signal(DBusMessageIter *iter, 35271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 35288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 35301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 3531c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt s16 level; 35328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 35341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 35351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 35368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3537c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt level = (s16) res->level; 35381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT16, 3539c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt &level, error); 35408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 35448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_frequency - Return the frequency of a BSS 35451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 35461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 35471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 35481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 35498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 35508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Frequency" property. 35518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 35521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_frequency(DBusMessageIter *iter, 35531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 35548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 35561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 3557c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt u16 freq; 35588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 35601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 35611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 35628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3563c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt freq = (u16) res->freq; 35641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT16, 3565c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt &freq, error); 35668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int cmp_u8s_desc(const void *a, const void *b) 35708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return (*(u8 *) b - *(u8 *) a); 35728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 35768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rates - Return available bit rates of a BSS 35771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 35781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 35791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 35801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 35818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 35828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Rates" property. 35838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 35841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_rates(DBusMessageIter *iter, 35851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 35868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 35881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 35898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *ie_rates = NULL; 35908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u32 *real_rates; 35918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int rates_num, i; 35921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 35938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 35951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 35961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 35978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt rates_num = wpa_bss_get_bit_rates(res, &ie_rates); 35998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (rates_num < 0) 36001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 36018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt qsort(ie_rates, rates_num, 1, cmp_u8s_desc); 36038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt real_rates = os_malloc(sizeof(u32) * rates_num); 36058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!real_rates) { 36068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ie_rates); 36071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 36081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 36098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 36108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < rates_num; i++) 36128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt real_rates[i] = ie_rates[i] * 500000; 36138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_UINT32, 36151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt real_rates, rates_num, 36161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 36178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ie_rates); 36198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(real_rates); 36201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 36218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 36228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic dbus_bool_t wpas_dbus_get_bss_security_prop(DBusMessageIter *iter, 36251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_ie_data *ie_data, 36261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error) 36278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 36281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter iter_dict, variant_iter; 36298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *group; 3630fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt const char *pairwise[5]; /* max 5 pairwise ciphers is supported */ 3631807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt const char *key_mgmt[9]; /* max 9 key managements may be supported */ 36328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int n; 36338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 36358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "a{sv}", &variant_iter)) 36368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 36378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict)) 36398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 36408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* KeyMgmt */ 36428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt n = 0; 36438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK) 36448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-psk"; 36458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_PSK) 36468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-ft-psk"; 36478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK_SHA256) 36488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-psk-sha256"; 36498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X) 36508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-eap"; 36518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X) 36528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-ft-eap"; 36538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256) 36548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-eap-sha256"; 3655807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#ifdef CONFIG_SUITEB 36566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B) 36576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt key_mgmt[n++] = "wpa-eap-suite-b"; 3658807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#endif /* CONFIG_SUITEB */ 3659807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#ifdef CONFIG_SUITEB192 3660807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B_192) 3661807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt key_mgmt[n++] = "wpa-eap-suite-b-192"; 3662807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#endif /* CONFIG_SUITEB192 */ 36638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_NONE) 36648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-none"; 36658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array(&iter_dict, "KeyMgmt", 36678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt, n)) 36688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 36698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Group */ 36718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (ie_data->group_cipher) { 36728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_WEP40: 36738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "wep40"; 36748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 36758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_TKIP: 36768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "tkip"; 36778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 36788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_CCMP: 36798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "ccmp"; 36808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 368161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt case WPA_CIPHER_GCMP: 368261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt group = "gcmp"; 368361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt break; 36848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_WEP104: 36858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "wep104"; 36868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 3687fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt case WPA_CIPHER_CCMP_256: 3688fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt group = "ccmp-256"; 3689fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt break; 3690fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt case WPA_CIPHER_GCMP_256: 3691fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt group = "gcmp-256"; 3692fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt break; 36938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 36948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = ""; 36958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 36968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 36978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string(&iter_dict, "Group", group)) 36998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 37008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Pairwise */ 37028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt n = 0; 37038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_TKIP) 37048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pairwise[n++] = "tkip"; 37058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_CCMP) 37068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pairwise[n++] = "ccmp"; 370761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_GCMP) 370861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pairwise[n++] = "gcmp"; 3709fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_CCMP_256) 3710fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt pairwise[n++] = "ccmp-256"; 3711fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_GCMP_256) 3712fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt pairwise[n++] = "gcmp-256"; 37138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array(&iter_dict, "Pairwise", 37158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pairwise, n)) 37168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 37178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Management group (RSN only) */ 37198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->proto == WPA_PROTO_RSN) { 37208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (ie_data->mgmt_group_cipher) { 37218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 37228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_AES_128_CMAC: 37238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "aes128cmac"; 37248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 37258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 37268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 37278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = ""; 37288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 37298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 37308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string(&iter_dict, "MgmtGroup", 37328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group)) 37338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 37348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 37358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict) || 37376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) 37388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 37398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 37418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem: 37431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 37441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 37458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 37468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 37498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_wpa - Return the WPA options of a BSS 37501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 37511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 37521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 37531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 37548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 37558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "WPA" property. 37568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 37571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_wpa(DBusMessageIter *iter, DBusError *error, 37581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 37598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 37601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 37611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 37628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ie_data wpa_data; 37638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *ie; 37648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 37661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 37671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 37688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&wpa_data, 0, sizeof(wpa_data)); 37708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie = wpa_bss_get_vendor_ie(res, WPA_IE_VENDOR_TYPE); 37716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (ie && wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0) { 37726c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 37736c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "failed to parse WPA IE"); 37746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return FALSE; 37758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 37768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_get_bss_security_prop(iter, &wpa_data, error); 37788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 37798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 37828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rsn - Return the RSN options of a BSS 37831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 37841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 37851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 37861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 37878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 37888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "RSN" property. 37898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 37901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_rsn(DBusMessageIter *iter, DBusError *error, 37911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 37928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 37931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 37941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 37958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ie_data wpa_data; 37968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *ie; 37978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 37991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 38001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 38018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&wpa_data, 0, sizeof(wpa_data)); 38038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie = wpa_bss_get_ie(res, WLAN_EID_RSN); 38046c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (ie && wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0) { 38056c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 38066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "failed to parse RSN IE"); 38076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return FALSE; 38088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 38098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_get_bss_security_prop(iter, &wpa_data, error); 38118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 38128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 3815d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * wpas_dbus_getter_bss_wps - Return the WPS options of a BSS 3816d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @iter: Pointer to incoming dbus message iter 3817d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @error: Location to store error on failure 3818d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @user_data: Function specific data 3819d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Returns: TRUE on success, FALSE on failure 3820d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * 3821d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Getter for "WPS" property. 3822d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt */ 3823d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_wps(DBusMessageIter *iter, DBusError *error, 3824d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt void *user_data) 3825d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{ 3826d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt struct bss_handler_args *args = user_data; 3827d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt struct wpa_bss *res; 3828d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_WPS 3829d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt struct wpabuf *wps_ie; 3830d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_WPS */ 3831d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt DBusMessageIter iter_dict, variant_iter; 38328347444e0bfb85e4550817fc99903f38ce8f5bccDmitry Shmidt int wps_support = 0; 3833d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt const char *type = ""; 3834d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3835d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt res = get_bss_helper(args, error, __func__); 3836d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (!res) 3837d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return FALSE; 3838d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3839d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 38406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "a{sv}", &variant_iter) || 38416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_open_write(&variant_iter, &iter_dict)) 3842d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt goto nomem; 3843d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3844d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_WPS 3845d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt wps_ie = wpa_bss_get_vendor_ie_multi(res, WPS_IE_VENDOR_TYPE); 3846d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (wps_ie) { 38478347444e0bfb85e4550817fc99903f38ce8f5bccDmitry Shmidt wps_support = 1; 3848d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (wps_is_selected_pbc_registrar(wps_ie)) 3849d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt type = "pbc"; 3850d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt else if (wps_is_selected_pin_registrar(wps_ie)) 3851d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt type = "pin"; 38526c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 38536c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpabuf_free(wps_ie); 3854d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt } 3855d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_WPS */ 3856d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 38578347444e0bfb85e4550817fc99903f38ce8f5bccDmitry Shmidt if ((wps_support && !wpa_dbus_dict_append_string(&iter_dict, "Type", type)) || 38586c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_close_write(&variant_iter, &iter_dict) || 38596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) 3860d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt goto nomem; 3861d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3862d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return TRUE; 3863d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3864d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtnomem: 3865d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 3866d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return FALSE; 3867d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt} 3868d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3869d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3870d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt/** 38718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ies - Return all IEs of a BSS 38721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 38731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 38741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 38751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 38768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 38778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "IEs" property. 38788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 38791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_ies(DBusMessageIter *iter, DBusError *error, 38801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 38818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 38821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 38831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 38848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 38861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 38871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 38888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE, 38901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res + 1, res->ie_len, 38911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 38928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 38938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 3896661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * wpas_dbus_getter_bss_age - Return time in seconds since BSS was last seen 3897661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 3898661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @error: Location to store error on failure 3899661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @user_data: Function specific data 3900661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Returns: TRUE on success, FALSE on failure 3901661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * 3902661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Getter for BSS age 3903661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt */ 3904661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_age(DBusMessageIter *iter, DBusError *error, 3905661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt void *user_data) 3906661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt{ 3907661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt struct bss_handler_args *args = user_data; 3908661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt struct wpa_bss *res; 3909661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt struct os_reltime now, diff = { 0, 0 }; 3910661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt u32 age; 3911661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 3912661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt res = get_bss_helper(args, error, __func__); 3913661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (!res) 3914661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt return FALSE; 3915661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 3916661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt os_get_reltime(&now); 3917661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt os_reltime_sub(&now, &res->last_update, &diff); 3918661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt age = diff.sec > 0 ? diff.sec : 0; 3919661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, &age, 3920661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt error); 3921661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt} 3922661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 3923661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 3924661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt/** 39258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_enabled - Check whether network is enabled or disabled 39261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 39271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 39281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 39291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 39308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 39318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "enabled" property of a configured network. 39328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 39331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_enabled(DBusMessageIter *iter, DBusError *error, 39341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 39358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 39361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct network_handler_args *net = user_data; 39378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t enabled = net->ssid->disabled ? FALSE : TRUE; 39381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 39391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 39401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &enabled, error); 39418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 39428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 39458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_enabled - Mark a configured network as enabled or disabled 39461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 39471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 39481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 39491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 39508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 39518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Enabled" property of a configured network. 39528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 39531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_enabled(DBusMessageIter *iter, DBusError *error, 39541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 39558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 39561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct network_handler_args *net = user_data; 39578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 39588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 39598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t enable; 39608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, 39621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &enable)) 39631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 39648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s = net->wpa_s; 39668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = net->ssid; 39678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (enable) 39698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_enable_network(wpa_s, ssid); 39708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 39718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_disable_network(wpa_s, ssid); 39728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 39748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 39758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 39788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_network_properties - Get options for a configured network 39791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 39801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 39811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 39821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 39838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 39848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Properties" property of a configured network. 39858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 39861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_network_properties(DBusMessageIter *iter, 39871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 39881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 39898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 39901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct network_handler_args *net = user_data; 39911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter, dict_iter; 39928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **iterator; 39938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **props = wpa_config_get_all(net->ssid, 1); 39941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 39958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!props) { 39971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 39981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 39998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 40008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, "a{sv}", 40021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &variant_iter) || 40038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !wpa_dbus_dict_open_write(&variant_iter, &dict_iter)) { 40041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 40058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 40068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 40078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator = props; 40098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*iterator) { 40108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string(&dict_iter, *iterator, 40118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *(iterator + 1))) { 40121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, 40131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "no memory"); 40148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 40158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 40168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator += 2; 40178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 40188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_close_write(&variant_iter, &dict_iter) || 40211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) { 40221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 40238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 40248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 40258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = TRUE; 40271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 40288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 40298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator = props; 40308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*iterator) { 40318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(*iterator); 40328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator++; 40338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 40348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(props); 40351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 40368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 40378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 40408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_network_properties - Set options for a configured network 40411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 40421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 40431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 40441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 40458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 40468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Properties" property of a configured network. 40478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 40481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_network_properties(DBusMessageIter *iter, 40491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 40501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 40518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 40521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct network_handler_args *net = user_data; 40538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid = net->ssid; 40541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter; 40558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_message_iter_recurse(iter, &variant_iter); 40571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return set_network_properties(net->wpa_s, ssid, &variant_iter, error); 40588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 405904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 406004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 406104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AP 406204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 406304949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_subscribe_preq( 406404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessage *message, struct wpa_supplicant *wpa_s) 406504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 406604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpas_dbus_priv *priv = wpa_s->global->dbus; 406704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *name; 406804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 406904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_s->preq_notify_peer != NULL) { 407004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strcmp(dbus_message_get_sender(message), 407104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->preq_notify_peer) == 0) 407204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 407304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 407404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return dbus_message_new_error(message, 407504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_DBUS_ERROR_SUBSCRIPTION_IN_USE, 407604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "Another application is already subscribed"); 407704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 407804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 407904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt name = os_strdup(dbus_message_get_sender(message)); 408004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!name) 40816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpas_dbus_error_no_memory(message); 408204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 408304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->preq_notify_peer = name; 408404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 408504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* Subscribe to clean up if application closes socket */ 408604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpas_dbus_subscribe_noc(priv); 408704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 408804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* 408904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Double-check it's still alive to make sure that we didn't 409004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * miss the NameOwnerChanged signal, e.g. while strdup'ing. 409104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 409204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_bus_name_has_owner(priv->con, name, NULL)) { 409304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* 409404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Application no longer exists, clean up. 409504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * The return value is irrelevant now. 409604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 409704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Need to check if the NameOwnerChanged handling 409804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * already cleaned up because we have processed 409904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * DBus messages while checking if the name still 410004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * has an owner. 410104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 410204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpa_s->preq_notify_peer) 410304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 410404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(wpa_s->preq_notify_peer); 410504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->preq_notify_peer = NULL; 410604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpas_dbus_unsubscribe_noc(priv); 410704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 410804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 410904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 411004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 411104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 411204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 411304949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_unsubscribe_preq( 411404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessage *message, struct wpa_supplicant *wpa_s) 411504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 411604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpas_dbus_priv *priv = wpa_s->global->dbus; 411704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 411804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpa_s->preq_notify_peer) 411904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return dbus_message_new_error(message, 412004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_DBUS_ERROR_NO_SUBSCRIPTION, 412104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "Not subscribed"); 412204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 412304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strcmp(wpa_s->preq_notify_peer, 412404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_get_sender(message))) 412504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return dbus_message_new_error(message, 412604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_DBUS_ERROR_SUBSCRIPTION_EPERM, 412704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "Can't unsubscribe others"); 412804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 412904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(wpa_s->preq_notify_peer); 413004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->preq_notify_peer = NULL; 413104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpas_dbus_unsubscribe_noc(priv); 413204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 413304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 413404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 413504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 413604949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid wpas_dbus_signal_preq(struct wpa_supplicant *wpa_s, 413704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const u8 *addr, const u8 *dst, const u8 *bssid, 413804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const u8 *ie, size_t ie_len, u32 ssi_signal) 413904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 414004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessage *msg; 414104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessageIter iter, dict_iter; 414204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpas_dbus_priv *priv = wpa_s->global->dbus; 414304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 414404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* Do nothing if the control interface is not turned on */ 4145cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (priv == NULL || !wpa_s->dbus_new_path) 414604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return; 414704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 414804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_s->preq_notify_peer == NULL) 414904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return; 415004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 415104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt msg = dbus_message_new_signal(wpa_s->dbus_new_path, 415204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_DBUS_NEW_IFACE_INTERFACE, 415304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "ProbeRequest"); 415404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (msg == NULL) 415504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return; 415604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 415704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_set_destination(msg, wpa_s->preq_notify_peer); 415804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 415904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_iter_init_append(msg, &iter); 416004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 41616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!wpa_dbus_dict_open_write(&iter, &dict_iter) || 41626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (addr && !wpa_dbus_dict_append_byte_array(&dict_iter, "addr", 41636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (const char *) addr, 41646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ETH_ALEN)) || 41656c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (dst && !wpa_dbus_dict_append_byte_array(&dict_iter, "dst", 41666c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (const char *) dst, 41676c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ETH_ALEN)) || 41686c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (bssid && !wpa_dbus_dict_append_byte_array(&dict_iter, "bssid", 41696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (const char *) bssid, 41706c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ETH_ALEN)) || 41716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (ie && ie_len && !wpa_dbus_dict_append_byte_array(&dict_iter, "ies", 41726c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (const char *) ie, 41736c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ie_len)) || 41746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (ssi_signal && !wpa_dbus_dict_append_int32(&dict_iter, "signal", 41756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ssi_signal)) || 41766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_close_write(&iter, &dict_iter)) 417704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto fail; 417804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 417904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_connection_send(priv->con, msg, NULL); 418004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto out; 418104949598a23f501be6eec21697465fd46a28840aDmitry Shmidtfail: 418204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "dbus: Failed to construct signal"); 418304949598a23f501be6eec21697465fd46a28840aDmitry Shmidtout: 418404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_unref(msg); 418504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 418604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 418704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AP */ 4188