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> 58d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2009, 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 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *debug_strings[] = { 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "excessive", "msgdump", "debug", "info", "warning", "error", NULL 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_unknown_error - Return a new InvalidArgs 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 /* 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function can be called as a result of a failure 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * within internal getter calls, which will call this function 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * with a NULL message parameter. However, dbus_message_new_error 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * looks very unkindly (i.e, abort()) on a NULL message, so 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * in this case, we should not call it. 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (message == NULL) { 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_INFO, "dbus: wpas_dbus_error_unknown_error " 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "called with NULL message (arg=%s)", 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt arg ? arg : "N/A"); 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_UNKNOWN_ERROR, 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt arg); 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_iface_unknown - Return a new invalid interface error message 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus error message 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid interface error 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic DBusMessage * wpas_dbus_error_iface_unknown(DBusMessage *message) 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_IFACE_UNKNOWN, 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa_supplicant knows nothing about " 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "this interface."); 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_network_unknown - Return a new NetworkUnknown error message 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid network error 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic DBusMessage * wpas_dbus_error_network_unknown(DBusMessage *message) 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_NETWORK_UNKNOWN, 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "There is no such a network in this " 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "interface."); 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_invalid_args - Return a new InvalidArgs error message 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid options error 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_error_invalid_args(DBusMessage *message, 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *arg) 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply; 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, WPAS_DBUS_ERROR_INVALID_ARGS, 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Did not receive correct message " 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "arguments."); 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (arg != NULL) 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_append_args(reply, DBUS_TYPE_STRING, &arg, 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1207dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt/** 1217dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * wpas_dbus_error_scan_error - Return a new ScanError error message 1227dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 1237dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @error: Optional string to be used as the error message 1247dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * Returns: a dbus error message 1257dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * 1267dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * Convenience function to create and return a scan error 1277dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt */ 1287dba0e5708da7276a43a44cf479aa743564e15b9Dmitry ShmidtDBusMessage * wpas_dbus_error_scan_error(DBusMessage *message, 1297dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt const char *error) 1307dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt{ 1317dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt DBusMessage *reply; 1327dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt 1337dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt reply = dbus_message_new_error(message, 1347dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt WPAS_DBUS_ERROR_IFACE_SCAN_ERROR, 1357dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt error); 1367dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt 1377dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt return reply; 1387dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt} 1397dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt 1407dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *dont_quote[] = { 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "key_mgmt", "proto", "pairwise", "auth_alg", "group", "eap", 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "opensc_engine_path", "pkcs11_engine_path", "pkcs11_module_path", 144d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt "bssid", "scan_freq", "freq_list", NULL 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic dbus_bool_t should_quote_opt(const char *key) 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i = 0; 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dont_quote[i] != NULL) { 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(key, dont_quote[i]) == 0) 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return FALSE; 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt i++; 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return TRUE; 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * get_iface_by_dbus_path - Get a new network interface 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: Pointer to global data from wpa_supplicant_init() 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @path: Pointer to a dbus object path representing an interface 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Pointer to the interface or %NULL if not found 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_supplicant * get_iface_by_dbus_path( 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global, const char *path) 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) { 1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(wpa_s->dbus_new_path, path) == 0) 1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_s; 1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * set_network_properties - Set properties of a configured network 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @ssid: wpa_ssid structure for a configured network 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @iter: DBus message iterator containing dictionary of network 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * properties to set. 1831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: On failure, an error describing the failure 1841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request succeeds, FALSE if it failed 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Sets network configuration with parameters given id DBus dictionary 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t set_network_properties(struct wpa_supplicant *wpa_s, 1891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_ssid *ssid, 1901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter *iter, 1911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error) 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_dbus_dict_entry entry = { .type = DBUS_TYPE_STRING }; 1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter_dict; 1951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char *value = NULL; 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpa_dbus_dict_open_read(iter, &iter_dict, error)) 1981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (wpa_dbus_dict_has_dict_entry(&iter_dict)) { 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t size = 50; 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 2031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpa_dbus_dict_get_entry(&iter_dict, &entry)) 2051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto error; 2061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt value = NULL; 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (entry.type == DBUS_TYPE_ARRAY && 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.array_type == DBUS_TYPE_BYTE) { 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (entry.array_len <= 0) 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size = entry.array_len * 2 + 1; 2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = wpa_snprintf_hex(value, size, 2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (u8 *) entry.bytearray_value, 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.array_len); 2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret <= 0) 2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (entry.type == DBUS_TYPE_STRING) { 2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (should_quote_opt(entry.key)) { 2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size = os_strlen(entry.str_value); 2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (size <= 0) 2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size += 3; 2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(value, size, "\"%s\"", 2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.str_value); 2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || (size_t) ret != (size - 1)) 2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_strdup(entry.str_value); 2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (entry.type == DBUS_TYPE_UINT32) { 2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(value, size, "%u", 2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.uint32_value); 2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret <= 0) 2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (entry.type == DBUS_TYPE_INT32) { 2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(value, size, "%d", 2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.int32_value); 2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret <= 0) 2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else 2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_set(ssid, entry.key, value, 0) < 0) 2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((os_strcmp(entry.key, "psk") == 0 && 2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value[0] == '"' && ssid->ssid_len) || 26904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt (os_strcmp(entry.key, "ssid") == 0 && ssid->passphrase)) 2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_update_psk(ssid); 2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (os_strcmp(entry.key, "priority") == 0) 2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_update_prio_list(wpa_s->conf); 2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 275623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt value = NULL; 2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 2801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidterror: 2821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(value); 2831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 2841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_INVALID_ARGS, 2851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "invalid message format"); 2861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_property_getter - Get basic type property 2921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Message iter to use when appending arguments 2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property (must be basic type) 2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @val: pointer to place holding property value 2951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: On failure an error describing the failure 2961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request was successful, FALSE if it failed 2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic getter for basic type properties. Type is required to be basic. 2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_property_getter(DBusMessageIter *iter, 3011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const int type, 3021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const void *val, 3031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error) 3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter; 3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_type_is_basic(type)) { 3081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: given type is not basic", __func__); 3101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 3141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_dbus_type_as_string(type), 3151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &variant_iter)) 3161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto error; 3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_append_basic(&variant_iter, type, val)) 3191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto error; 3201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_close_container(iter, &variant_iter)) 3221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto error; 3231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 3251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidterror: 3271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: error constructing reply", __func__); 3291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_property_setter - Set basic type property 3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property (must be basic type) 3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @val: pointer to place where value being set will be stored 3381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request was successful, FALSE if it failed 3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic setter for basic type properties. Type is required to be basic. 3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_property_setter(DBusMessageIter *iter, 3431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 3441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const int type, void *val) 3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter; 3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_type_is_basic(type)) { 3491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: given type is not basic", __func__); 3511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Look at the new value */ 3551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_message_iter_recurse(iter, &variant_iter); 3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&variant_iter) != type) { 3571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 3581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "wrong property type"); 3591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&variant_iter, val); 3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_array_property_getter - Get array type property 3691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iterator 3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property array elements (must be basic type) 3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @array: pointer to array of elements to put into response message 3728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @array_len: length of above array 3731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: a pointer to an error to fill on failure 3741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request succeeded, FALSE if it failed 3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic getter for array type properties. Array elements type is 3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * required to be basic. 3788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_array_property_getter(DBusMessageIter *iter, 3801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const int type, 3811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const void *array, 3821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt size_t array_len, 3831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error) 3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter, array_iter; 3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char type_str[] = "a?"; /* ? will be replaced with subtype letter; */ 3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *sub_type_str; 3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t element_size, i; 3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_type_is_basic(type)) { 3911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: given type is not basic", __func__); 3931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sub_type_str = wpa_dbus_type_as_string(type); 3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt type_str[1] = sub_type_str[0]; 3988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 4001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt type_str, &variant_iter)) { 4011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 4021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: failed to construct message 1", __func__); 4031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY, 4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sub_type_str, &array_iter)) { 4081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 4091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: failed to construct message 2", __func__); 4101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch(type) { 4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_BYTE: 4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_BOOLEAN: 4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = 1; 4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_INT16: 4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_UINT16: 4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(uint16_t); 4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_INT32: 4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_UINT32: 4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(uint32_t); 4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_INT64: 4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_UINT64: 4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(uint64_t); 4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_DOUBLE: 4318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(double); 4328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_STRING: 4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_OBJECT_PATH: 4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(char *); 4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 4381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 4391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: unknown element type %d", __func__, type); 4401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 4418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < array_len; i++) { 44443cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt if (!dbus_message_iter_append_basic(&array_iter, type, 44543cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt array + i * element_size)) { 44643cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 44743cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt "%s: failed to construct message 2.5", 44843cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt __func__); 44943cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt return FALSE; 45043cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt } 4518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_close_container(&variant_iter, &array_iter)) { 4541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 4551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: failed to construct message 3", __func__); 4561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_close_container(iter, &variant_iter)) { 4601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 4611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: failed to construct message 4", __func__); 4621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 4631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 4641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 4651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 4668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 47004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_simple_array_array_property_getter - Get array array type property 47104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iterator 47204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @type: DBus type of property array elements (must be basic type) 47304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @array: pointer to array of elements to put into response message 47404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @array_len: length of above array 47504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: a pointer to an error to fill on failure 47604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE if the request succeeded, FALSE if it failed 47704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 47804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Generic getter for array type properties. Array elements type is 47904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * required to be basic. 48004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 48104949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_simple_array_array_property_getter(DBusMessageIter *iter, 48204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const int type, 48304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpabuf **array, 48404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt size_t array_len, 48504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusError *error) 48604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 48704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessageIter variant_iter, array_iter; 48804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char type_str[] = "aa?"; 48904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char inner_type_str[] = "a?"; 49004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const char *sub_type_str; 49104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt size_t i; 49204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 49304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_type_is_basic(type)) { 49404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 49504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "%s: given type is not basic", __func__); 49604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 49704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 49804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 49904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt sub_type_str = wpa_dbus_type_as_string(type); 50004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt type_str[2] = sub_type_str[0]; 50104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt inner_type_str[1] = sub_type_str[0]; 50204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 50304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 50404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt type_str, &variant_iter)) { 50504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 50604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "%s: failed to construct message 1", __func__); 50704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 50804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 50904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY, 51004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt inner_type_str, &array_iter)) { 51104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 51204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "%s: failed to construct message 2", __func__); 51304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 51404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 51504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 516c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt for (i = 0; i < array_len && array[i]; i++) { 51704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_dbus_dict_bin_array_add_element(&array_iter, 51804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpabuf_head(array[i]), 51904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpabuf_len(array[i])); 52004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 52104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 52204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 52304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_message_iter_close_container(&variant_iter, &array_iter)) { 52404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 52504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "%s: failed to close message 2", __func__); 52604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 52704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 52804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 52904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_message_iter_close_container(iter, &variant_iter)) { 53004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 53104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "%s: failed to close message 1", __func__); 53204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 53304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 53404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 53504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return TRUE; 53604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 53704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 53804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 53904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_create_interface - Request registration of a network iface 5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure 5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the new interface object, 5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or a dbus error message with more information 5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "CreateInterface" method call. Handles requests 5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to register a network interface that wpa_supplicant 5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * will manage. 5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_create_interface(DBusMessage *message, 5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter_dict; 5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter; 5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_dbus_dict_entry entry; 5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *driver = NULL; 5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *ifname = NULL; 5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *confname = NULL; 5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *bridge_ifname = NULL; 5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 5638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpa_dbus_dict_open_read(&iter, &iter_dict, NULL)) 5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (wpa_dbus_dict_has_dict_entry(&iter_dict)) { 5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_get_entry(&iter_dict, &entry)) 5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 56904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!os_strcmp(entry.key, "Driver") && 5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (entry.type == DBUS_TYPE_STRING)) { 571623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt os_free(driver); 5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt driver = os_strdup(entry.str_value); 5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (driver == NULL) 5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 57604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (!os_strcmp(entry.key, "Ifname") && 5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (entry.type == DBUS_TYPE_STRING)) { 578623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt os_free(ifname); 5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ifname = os_strdup(entry.str_value); 5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ifname == NULL) 5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 58304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (!os_strcmp(entry.key, "ConfigFile") && 5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (entry.type == DBUS_TYPE_STRING)) { 585623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt os_free(confname); 5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt confname = os_strdup(entry.str_value); 5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (confname == NULL) 5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 59004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (!os_strcmp(entry.key, "BridgeIfname") && 5918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (entry.type == DBUS_TYPE_STRING)) { 592623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt os_free(bridge_ifname); 5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bridge_ifname = os_strdup(entry.str_value); 5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bridge_ifname == NULL) 5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ifname == NULL) 6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; /* Required Ifname argument missing */ 6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Try to get the wpa_supplicant record for this iface, return 6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * an error if we already control it. 6098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_get_iface(global, ifname) != NULL) { 6118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, 6128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPAS_DBUS_ERROR_IFACE_EXISTS, 6138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa_supplicant already " 6148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "controls this interface."); 6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_interface iface; 6188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&iface, 0, sizeof(iface)); 6198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.driver = driver; 6208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.ifname = ifname; 6218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.confname = confname; 6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.bridge_ifname = bridge_ifname; 6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Otherwise, have wpa_supplicant attach to it. */ 6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((wpa_s = wpa_supplicant_add_iface(global, &iface))) { 6258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *path = wpa_s->dbus_new_path; 6268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 6278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, 6288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &path, DBUS_TYPE_INVALID); 6298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 6308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_unknown_error( 6318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "wpa_supplicant couldn't grab this " 6328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "interface."); 6338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 6378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(driver); 6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ifname); 63961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_free(confname); 6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bridge_ifname); 6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 6428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterror: 6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, NULL); 6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_interface - Request deregistration of an interface 6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: wpa_supplicant global data structure 6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing a UINT32 indicating success (1) or 6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * failure (0), or returns a dbus error message with more information 6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "removeInterface" method call. Handles requests 6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to deregister a network interface that wpa_supplicant 6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * currently manages. 6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_interface(DBusMessage *message, 6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *path; 6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &path, 6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s = get_iface_by_dbus_path(global, path); 6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s == NULL) 6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_iface_unknown(message); 673c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt else if (wpa_supplicant_remove_iface(global, wpa_s, 0)) { 6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_unknown_error( 6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "wpa_supplicant couldn't remove this " 6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "interface."); 6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_interface - Get the object path for an interface name 6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure 6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the interface object, 6888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or a dbus error message with more information 6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "getInterface" method call. 6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_interface(DBusMessage *message, 6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *ifname; 6978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *path; 6988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 6998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &ifname, 7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s = wpa_supplicant_get_iface(global, ifname); 7048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s == NULL) 7058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_error_iface_unknown(message); 7068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt path = wpa_s->dbus_new_path; 7088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 7098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply == NULL) 7108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 7118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path, 7138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID)) { 7148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 7158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 7168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 7178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 7208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_level - Get debug level 7251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 7261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 7271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 7281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 7298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugLevel" property. 7318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_level(DBusMessageIter *iter, 7331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 7341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 7358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *str; 7378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int idx = wpa_debug_level; 7381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 7398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (idx < 0) 7408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt idx = 0; 7418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (idx > 5) 7428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt idx = 5; 7438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt str = debug_strings[idx]; 7441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 7451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &str, error); 7468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_timestamp - Get debug timestamp 7511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 7521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 7531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 7541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 7558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugTimestamp" property. 7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_timestamp(DBusMessageIter *iter, 7591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 7601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 7618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 7631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &wpa_debug_timestamp, error); 7648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_show_keys - Get debug show keys 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 * Getter for "DebugShowKeys" property. 7768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_show_keys(DBusMessageIter *iter, 7781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 7791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 7808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 7821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &wpa_debug_show_keys, error); 7838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_level - Set debug level 7881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 7891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 7901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 7911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 7928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugLevel" property. 7948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_level(DBusMessageIter *iter, 7961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 7978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_global *global = user_data; 7998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *str = NULL; 8008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i, val = -1; 8018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING, 8031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &str)) 8041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 8058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; debug_strings[i]; i++) 8078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(debug_strings[i], str) == 0) { 8088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val = i; 8098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 8108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (val < 0 || 8138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_set_debug_params(global, val, wpa_debug_timestamp, 8148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_show_keys)) { 8151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, "wrong debug " 8161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "level value"); 8171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 8188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 8218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 8258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_timestamp - Set debug timestamp 8261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 8271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 8281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 8291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 8308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 8318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugTimestamp" property. 8328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 8331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_timestamp(DBusMessageIter *iter, 8341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 8351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 8368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_global *global = user_data; 8388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t val; 8398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, 8411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &val)) 8421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 8438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_set_debug_params(global, wpa_debug_level, val ? 1 : 0, 8458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_show_keys); 8461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 8478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 8518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_show_keys - Set debug show keys 8521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 8531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 8541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 8551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 8568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 8578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugShowKeys" property. 8588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 8591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_show_keys(DBusMessageIter *iter, 8601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 8611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 8628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_global *global = user_data; 8648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t val; 8658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, 8671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &val)) 8681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 8698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_set_debug_params(global, wpa_debug_level, 8718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_timestamp, 8728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val ? 1 : 0); 8731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 8748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 8788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_interfaces - Request registered interfaces list 8791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 8801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 8811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 8821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 8838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 8848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Interfaces" property. Handles requests 8858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of registered interfaces objects 8868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * paths 8878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 8881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_interfaces(DBusMessageIter *iter, 8891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 8901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 8918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_global *global = user_data; 8938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 8948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char **paths; 8958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int i = 0, num = 0; 8961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success; 8978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) 8998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt num++; 9008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 90161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt paths = os_calloc(num, sizeof(char *)); 9028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!paths) { 9031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 9041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 9058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) 9088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt paths[i++] = wpa_s->dbus_new_path; 9098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, 9111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_OBJECT_PATH, 9121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt paths, num, error); 9138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths); 9151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 9168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 9208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_eap_methods - Request supported EAP methods list 9211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 9221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 9231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 9241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 9258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 9268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "EapMethods" property. Handles requests 9278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of strings with supported EAP methods 9288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 9291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_eap_methods(DBusMessageIter *iter, 9301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 9318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **eap_methods; 9338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t num_items = 0; 9341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success; 9358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eap_methods = eap_get_names_as_string_array(&num_items); 9378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!eap_methods) { 9381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 9391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 9408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, 9431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_STRING, 9441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt eap_methods, 9451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt num_items, error); 9468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (num_items) 9488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(eap_methods[--num_items]); 9498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(eap_methods); 9501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 9518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 954d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt/** 955d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * wpas_dbus_getter_global_capabilities - Request supported global capabilities 956d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @iter: Pointer to incoming dbus message iter 957d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @error: Location to store error on failure 958d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @user_data: Function specific data 959d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Returns: TRUE on success, FALSE on failure 960d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * 961d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Getter for "Capabilities" property. Handles requests by dbus clients to 962d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * return a list of strings with supported capabilities like AP, RSN IBSS, 963d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * and P2P that are determined at compile time. 964d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt */ 965d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtdbus_bool_t wpas_dbus_getter_global_capabilities(DBusMessageIter *iter, 966d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt DBusError *error, 967d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt void *user_data) 968d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{ 969d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt const char *capabilities[5] = { NULL, NULL, NULL, NULL, NULL }; 970d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt size_t num_items = 0; 971d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 972d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_AP 973d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities[num_items++] = "ap"; 974d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_AP */ 975d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_IBSS_RSN 976d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities[num_items++] = "ibss-rsn"; 977d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_IBSS_RSN */ 978d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_P2P 979d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities[num_items++] = "p2p"; 980d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_P2P */ 981d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_INTERWORKING 982d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities[num_items++] = "interworking"; 983d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_INTERWORKING */ 984d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 985d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return wpas_dbus_simple_array_property_getter(iter, 986d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt DBUS_TYPE_STRING, 987d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities, 988d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt num_items, error); 989d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt} 990d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 991d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 9928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_type(DBusMessage *message, DBusMessageIter *var, 9938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **type, DBusMessage **reply) 9948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_STRING) { 9968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 9978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Type must be a string"); 9988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 9998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong Type value type. String required"); 10008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(var, type); 10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 10048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ssids(DBusMessage *message, DBusMessageIter *var, 10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params *params, 10098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage **reply) 10108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_ssid *ssids = params->ssids; 10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t ssids_num = 0; 10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *ssid; 10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter array_iter, sub_array_iter; 10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *val; 10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int len; 10178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) { 10198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: ssids " 10208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "must be an array of arrays of bytes"); 10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong SSIDs value type. Array of arrays of " 10238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "bytes required"); 10248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(var, &array_iter); 10288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY || 10308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE) 10318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 10328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: ssids " 10338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "must be an array of arrays of bytes"); 10348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong SSIDs value type. Array of arrays of " 10368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "bytes required"); 10378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY) 10418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 10428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssids_num >= WPAS_MAX_SCAN_SSIDS) { 10438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 10448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Too many ssids specified on scan dbus " 10458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "call"); 10468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Too many ssids specified. Specify " 10488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "at most four"); 10498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&array_iter, &sub_array_iter); 10538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len); 10558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1056c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt if (len > MAX_SSID_LEN) { 1057c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt wpa_printf(MSG_DEBUG, 1058c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt "wpas_dbus_handler_scan[dbus]: " 1059c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt "SSID too long (len=%d max_len=%d)", 1060c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt len, MAX_SSID_LEN); 1061c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 1062c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt message, "Invalid SSID: too long"); 1063c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return -1; 1064c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt } 1065c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (len != 0) { 10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = os_malloc(len); 10688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 10698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, 10708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpas_dbus_handler_scan[dbus]: " 10718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "out of memory. Cannot allocate " 10728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "memory for SSID"); 10738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = dbus_message_new_error( 10748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, DBUS_ERROR_NO_MEMORY, NULL); 10758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(ssid, val, len); 10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 10798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Allow zero-length SSIDs */ 10808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = NULL; 10818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssids[ssids_num].ssid = ssid; 10848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssids[ssids_num].ssid_len = len; 10858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 10878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssids_num++; 10888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->num_ssids = ssids_num; 10918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 10928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ies(DBusMessage *message, DBusMessageIter *var, 10968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params *params, 10978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage **reply) 10988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *ies = NULL, *nies; 11008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ies_len = 0; 11018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter array_iter, sub_array_iter; 11028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *val; 11038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int len; 11048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) { 11068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: ies must " 11078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "be an array of arrays of bytes"); 11088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong IEs value type. Array of arrays of " 11108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "bytes required"); 11118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(var, &array_iter); 11158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY || 11178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE) 11188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 11198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: ies must " 11208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "be an array of arrays of bytes"); 11218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong IEs value type. Array required"); 11238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY) 11278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 11288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&array_iter, &sub_array_iter); 11298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len); 11318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (len == 0) { 11328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 11338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 11348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nies = os_realloc(ies, ies_len + len); 11378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nies == NULL) { 11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 11398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "out of memory. Cannot allocate memory for " 11408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "IE"); 11418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ies); 11428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = dbus_message_new_error( 11438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, DBUS_ERROR_NO_MEMORY, NULL); 11448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ies = nies; 11478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(ies + ies_len, val, len); 11488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ies_len += len; 11498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 11518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->extra_ies = ies; 11548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->extra_ies_len = ies_len; 11558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 11568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 11578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_channels(DBusMessage *message, 11608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter *var, 11618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params *params, 11628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage **reply) 11638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 11648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter array_iter, sub_array_iter; 11658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int *freqs = NULL, *nfreqs; 11668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int freqs_num = 0; 11678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) { 11698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 11708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Channels must be an array of structs"); 11718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong Channels value type. Array of structs " 11738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "required"); 11748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(var, &array_iter); 11788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_STRUCT) { 11808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, 11818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpas_dbus_handler_scan[dbus]: Channels must be an " 11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "array of structs"); 11838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong Channels value type. Array of structs " 11858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "required"); 11868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_STRUCT) 11908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 11918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int freq, width; 11928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&array_iter, &sub_array_iter); 11948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&sub_array_iter) != 11968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_UINT32) { 11978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 11988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Channel must by specified by struct of " 11998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "two UINT32s %c", 12008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_arg_type( 12018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &sub_array_iter)); 12028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 12038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong Channel struct. Two UINT32s " 12048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "required"); 12058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 12068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&sub_array_iter, &freq); 12098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_next(&sub_array_iter) || 12118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_arg_type(&sub_array_iter) != 12128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_UINT32) { 12138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 12148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Channel must by specified by struct of " 12158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "two UINT32s"); 12168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 12178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, 12188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Wrong Channel struct. Two UINT32s required"); 12198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 12208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&sub_array_iter, &width); 12248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define FREQS_ALLOC_CHUNK 32 12268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (freqs_num % FREQS_ALLOC_CHUNK == 0) { 122761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt nfreqs = os_realloc_array( 122861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt freqs, freqs_num + FREQS_ALLOC_CHUNK, 122961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt sizeof(int)); 12308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nfreqs == NULL) 12318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 12328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs = nfreqs; 12338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (freqs == NULL) { 12358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 12368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "out of memory. can't allocate memory for " 12378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "freqs"); 12388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = dbus_message_new_error( 12398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, DBUS_ERROR_NO_MEMORY, NULL); 12408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs[freqs_num] = freq; 12448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs_num++; 12468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 12478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 124961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt nfreqs = os_realloc_array(freqs, freqs_num + 1, sizeof(int)); 12508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nfreqs == NULL) 12518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 12528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs = nfreqs; 12538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (freqs == NULL) { 12548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 12558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "out of memory. Can't allocate memory for freqs"); 12568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = dbus_message_new_error( 12578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, DBUS_ERROR_NO_MEMORY, NULL); 12588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs[freqs_num] = 0; 12618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->freqs = freqs; 12638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 12648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 12658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1267051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidtstatic int wpas_dbus_get_scan_allow_roam(DBusMessage *message, 1268051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt DBusMessageIter *var, 1269051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt dbus_bool_t *allow, 1270051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt DBusMessage **reply) 1271051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt{ 1272051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_BOOLEAN) { 1273051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 1274051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt "Type must be a boolean"); 1275051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 1276051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt message, "Wrong Type value type. Boolean required"); 1277051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt return -1; 1278051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt } 1279051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt dbus_message_iter_get_basic(var, allow); 1280051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt return 0; 1281051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt} 1282051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 1283051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 12848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 12858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_scan - Request a wireless scan on an interface 12868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 12878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 12888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL indicating success or DBus error message on failure 12898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 12908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Scan" method call of a network device. Requests 12918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * that wpa_supplicant perform a wireless scan as soon as possible 12928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * on a particular wireless interface. 12938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 12948d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_scan(DBusMessage *message, 12958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 12968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 12978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 12988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, dict_iter, entry_iter, variant_iter; 12998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *key = NULL, *type = NULL; 13008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params params; 13018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t i; 1302051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt dbus_bool_t allow_roam = 1; 13038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(¶ms, 0, sizeof(params)); 13058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 13078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&iter, &dict_iter); 13098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dbus_message_iter_get_arg_type(&dict_iter) == 13118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_DICT_ENTRY) { 13128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&dict_iter, &entry_iter); 13138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&entry_iter, &key); 13148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&entry_iter); 13158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&entry_iter, &variant_iter); 13168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(key, "Type") == 0) { 13188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_type(message, &variant_iter, 13198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &type, &reply) < 0) 13208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(key, "SSIDs") == 0) { 13228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_ssids(message, &variant_iter, 13238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ¶ms, &reply) < 0) 13248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(key, "IEs") == 0) { 13268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_ies(message, &variant_iter, 13278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ¶ms, &reply) < 0) 13288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(key, "Channels") == 0) { 13308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_channels(message, &variant_iter, 13318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ¶ms, &reply) < 0) 13328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 1333051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt } else if (os_strcmp(key, "AllowRoam") == 0) { 1334051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt if (wpas_dbus_get_scan_allow_roam(message, 1335051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt &variant_iter, 1336051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt &allow_roam, 1337051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt &reply) < 0) 1338051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt goto out; 13398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 13408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 13418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Unknown argument %s", key); 13428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, key); 13438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&dict_iter); 13478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!type) { 13508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 13518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Scan type not specified"); 13528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, key); 13538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!os_strcmp(type, "passive")) { 13578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (params.num_ssids || params.extra_ies_len) { 13588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 13598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "SSIDs or IEs specified for passive scan."); 13608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args( 13618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "You can specify only Channels in " 13628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "passive scan"); 13638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (params.freqs && params.freqs[0]) { 13657dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt if (wpa_supplicant_trigger_scan(wpa_s, ¶ms)) { 13667dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt reply = wpas_dbus_error_scan_error( 13677dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt message, "Scan request rejected"); 13687dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt } 13698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 1370d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt wpa_s->scan_req = MANUAL_SCAN_REQ; 13718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_req_scan(wpa_s, 0, 0); 13728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (!os_strcmp(type, "active")) { 13748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!params.num_ssids) { 13758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Add wildcard ssid */ 13768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.num_ssids++; 13778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 137804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN 137904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt autoscan_deinit(wpa_s); 138004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */ 13817dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt if (wpa_supplicant_trigger_scan(wpa_s, ¶ms)) { 13827dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt reply = wpas_dbus_error_scan_error( 13837dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt message, "Scan request rejected"); 13847dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt } 13858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 13868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 13878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Unknown scan type: %s", type); 13888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, 13898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Wrong scan type"); 13908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1393051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt if (!allow_roam) 1394051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt wpa_s->scan_res_handler = scan_only_handler; 1395051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 13968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 13978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < WPAS_MAX_SCAN_SSIDS; i++) 13988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free((u8 *) params.ssids[i].ssid); 13998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free((u8 *) params.extra_ies); 14008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(params.freqs); 14018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 14028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 14038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1405661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt/** 1406661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * wpas_dbus_handler_signal_poll - Request immediate signal properties 1407661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @message: Pointer to incoming dbus message 1408661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 1409661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Returns: NULL indicating success or DBus error message on failure 1410661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * 1411661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Handler function for "SignalPoll" method call of a network device. Requests 1412661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * that wpa_supplicant read signal properties like RSSI, noise, and link 1413661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * speed and return them. 1414661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt */ 1415661b4f78e48c697429dc46154a4125892c001718Dmitry ShmidtDBusMessage * wpas_dbus_handler_signal_poll(DBusMessage *message, 1416661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt struct wpa_supplicant *wpa_s) 1417661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt{ 1418661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt struct wpa_signal_info si; 1419661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt DBusMessage *reply = NULL; 1420661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt DBusMessageIter iter, iter_dict, variant_iter; 1421661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt int ret; 1422661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1423661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt ret = wpa_drv_signal_poll(wpa_s, &si); 1424661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (ret) { 1425661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_FAILED, 1426661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt "Failed to read signal"); 1427661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt } 1428661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1429661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt reply = dbus_message_new_method_return(message); 1430661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (reply == NULL) 1431661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt goto nomem; 1432661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1433661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt dbus_message_iter_init_append(reply, &iter); 1434661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1435661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT, 1436661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt "a{sv}", &variant_iter)) 1437661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt goto nomem; 1438661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict)) 1439661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt goto nomem; 1440661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1441661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (!wpa_dbus_dict_append_int32(&iter_dict, "rssi", si.current_signal)) 1442661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt goto nomem; 1443661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (!wpa_dbus_dict_append_int32(&iter_dict, "linkspeed", 1444661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt si.current_txrate / 1000)) 1445661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt goto nomem; 1446661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (!wpa_dbus_dict_append_int32(&iter_dict, "noise", si.current_noise)) 1447661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt goto nomem; 1448661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (!wpa_dbus_dict_append_uint32(&iter_dict, "frequency", si.frequency)) 1449661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt goto nomem; 1450661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1451661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (si.chanwidth != CHAN_WIDTH_UNKNOWN) { 1452661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (!wpa_dbus_dict_append_string(&iter_dict, "width", 1453661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt channel_width_to_string(si.chanwidth))) 1454661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt goto nomem; 1455661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt } 1456661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1457661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (si.center_frq1 > 0 && si.center_frq2 > 0) { 1458661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (!wpa_dbus_dict_append_int32(&iter_dict, "center-frq1", 1459661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt si.center_frq1)) 1460661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt goto nomem; 1461661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (!wpa_dbus_dict_append_int32(&iter_dict, "center-frq2", 1462661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt si.center_frq2)) 1463661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt goto nomem; 1464661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt } 1465661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1466661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (si.avg_signal) { 1467661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (!wpa_dbus_dict_append_int32(&iter_dict, "avg-rssi", 1468661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt si.avg_signal)) 1469661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt goto nomem; 1470661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt } 1471661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1472661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict)) 1473661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt goto nomem; 1474661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (!dbus_message_iter_close_container(&iter, &variant_iter)) 1475661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt goto nomem; 1476661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1477661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt return reply; 1478661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1479661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidtnomem: 1480661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (reply) 1481661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt dbus_message_unref(reply); 1482661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, NULL); 1483661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt return reply; 1484661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt} 1485661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1486661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 14878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 14888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_disconnect - Terminate the current connection 14898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 14908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 14918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NotConnected DBus error message if already not connected 14928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or NULL otherwise. 14938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 14948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Disconnect" method call of network interface. 14958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 14968d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_disconnect(DBusMessage *message, 14978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 14988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 14998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->current_ssid != NULL) { 15008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->disconnected = 1; 15018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_deauthenticate(wpa_s, 15028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WLAN_REASON_DEAUTH_LEAVING); 15038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 15058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_NOT_CONNECTED, 15088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "This interface is not connected"); 15098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 15108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 15138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_add_network - Add a new configured network 15148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 15158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 15168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing the object path of the new network 15178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 15188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "AddNetwork" method call of a network interface. 15198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 15208d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_network(DBusMessage *message, 15218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 15228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 15238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 15248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter; 15258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid = NULL; 15268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *path = path_buf; 15271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError error; 15288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 15308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = wpa_config_add_network(wpa_s->conf); 15328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 15338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "wpas_dbus_handler_add_network[dbus]: " 15348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "can't add new interface."); 15358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_unknown_error( 15368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, 15378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa_supplicant could not add " 15388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "a network on this interface."); 15398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 15408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_added(wpa_s, ssid); 15428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid->disabled = 1; 15438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_set_network_defaults(ssid); 15448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_error_init(&error); 15461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!set_network_properties(wpa_s, ssid, &iter, &error)) { 15478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_add_network[dbus]:" 15488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "control interface couldn't set network " 15498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "properties"); 15501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_reply_new_from_error(message, &error, 15511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_ERROR_INVALID_ARGS, 15521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "Failed to add network"); 15531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_error_free(&error); 15548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 15558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Construct the object path for this network. */ 15588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX, 15598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d", 15608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, ssid->id); 15618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 15638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply == NULL) { 15648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 15658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 15668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 15678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path, 15698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID)) { 15708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 15718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 15728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 15738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 15748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 15778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr: 15798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid) { 15808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_removed(wpa_s, ssid); 15818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_remove_network(wpa_s->conf, ssid->id); 15828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 15848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 15858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1588413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt * wpas_dbus_handler_reassociate - Reassociate 158961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * @message: Pointer to incoming dbus message 159061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 1591413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt * Returns: InterfaceDisabled DBus error message if disabled 159261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * or NULL otherwise. 159361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * 159461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * Handler function for "Reassociate" method call of network interface. 159561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt */ 159661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtDBusMessage * wpas_dbus_handler_reassociate(DBusMessage *message, 159761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt struct wpa_supplicant *wpa_s) 159861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 1599413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt if (wpa_s->wpa_state != WPA_INTERFACE_DISABLED) { 1600d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt wpas_request_connection(wpa_s); 160161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return NULL; 160261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 160361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 1604413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_IFACE_DISABLED, 1605413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt "This interface is disabled"); 160661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 160761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 160861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 160961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt/** 16109866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * wpas_dbus_handler_reattach - Reattach to current AP 16119866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * @message: Pointer to incoming dbus message 16129866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 16139866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * Returns: NotConnected DBus error message if not connected 16149866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * or NULL otherwise. 16159866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * 16169866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * Handler function for "Reattach" method call of network interface. 16179866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt */ 16189866086a955d00e237cc8df3722e7dff75c02532Dmitry ShmidtDBusMessage * wpas_dbus_handler_reattach(DBusMessage *message, 16199866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt struct wpa_supplicant *wpa_s) 16209866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt{ 16219866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt if (wpa_s->current_ssid != NULL) { 16229866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt wpa_s->reattach = 1; 16239866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt wpas_request_connection(wpa_s); 16249866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt return NULL; 16259866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt } 16269866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt 16279866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_NOT_CONNECTED, 16289866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt "This interface is not connected"); 16299866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt} 16309866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt 16319866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt 16329866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt/** 16338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_network - Remove a configured network 16348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 16358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 16368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure 16378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 16388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveNetwork" method call of a network interface. 16398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 16408d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_network(DBusMessage *message, 16418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 16428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 16438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 16448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *op; 16458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *iface = NULL, *net_id = NULL; 16468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int id; 16478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 16482f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt int was_disabled; 16498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op, 16518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 16528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Extract the network ID and ensure the network */ 16548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* is actually a child of this interface */ 165575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen iface = wpas_dbus_new_decompose_object_path(op, 0, &net_id, NULL); 1656d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (iface == NULL || net_id == NULL || 1657d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt os_strcmp(iface, wpa_s->dbus_new_path) != 0) { 16588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 16598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 16608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1662d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt errno = 0; 16638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt id = strtoul(net_id, NULL, 10); 1664d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (errno != 0) { 16658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 16668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 16678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 16708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 16718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_network_unknown(message); 16728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 16738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16752f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt was_disabled = ssid->disabled; 16762f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 16778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_removed(wpa_s, ssid); 16788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == wpa_s->current_ssid) 16808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_deauthenticate(wpa_s, 16818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WLAN_REASON_DEAUTH_LEAVING); 16822f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt else if (!was_disabled && wpa_s->sched_scanning) { 16832f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt wpa_printf(MSG_DEBUG, "Stop ongoing sched_scan to remove " 16842f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt "network from filters"); 16852f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt wpa_supplicant_cancel_sched_scan(wpa_s); 16862f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt wpa_supplicant_req_scan(wpa_s, 0, 0); 16872f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt } 16882f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 1689684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt if (wpa_config_remove_network(wpa_s->conf, id) < 0) { 1690684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt wpa_printf(MSG_ERROR, 1691684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt "wpas_dbus_handler_remove_network[dbus]: " 1692684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt "error occurred when removing network %d", id); 1693684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt reply = wpas_dbus_error_unknown_error( 1694684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt message, "error removing the specified network on " 1695684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt "this interface."); 1696684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt goto out; 1697684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt } 16988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 17008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(iface); 17018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(net_id); 17028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 17038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void remove_network(void *arg, struct wpa_ssid *ssid) 17078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = arg; 17098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_removed(wpa_s, ssid); 17118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_remove_network(wpa_s->conf, ssid->id) < 0) { 17138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, 17148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpas_dbus_handler_remove_all_networks[dbus]: " 17158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "error occurred when removing network %d", 17168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid->id); 17178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 17188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == wpa_s->current_ssid) 1721d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt wpa_supplicant_deauthenticate(wpa_s, 1722d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt WLAN_REASON_DEAUTH_LEAVING); 17238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 17278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_all_networks - Remove all configured networks 17288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 17298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 17308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure 17318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 17328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveAllNetworks" method call of a network interface. 17338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 17348d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_all_networks( 17358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *message, struct wpa_supplicant *wpa_s) 17368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17372f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt if (wpa_s->sched_scanning) 17382f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt wpa_supplicant_cancel_sched_scan(wpa_s); 17392f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 17408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* NB: could check for failure and return an error */ 17418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_foreach_network(wpa_s->conf, remove_network, wpa_s); 17428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 17438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 17478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_select_network - Attempt association with a network 17488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 17498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 17508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure 17518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 17528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "SelectNetwork" method call of network interface. 17538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 17548d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_select_network(DBusMessage *message, 17558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 17568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 17588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *op; 17598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *iface = NULL, *net_id = NULL; 17608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int id; 17618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 17628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op, 17648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 17658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Extract the network ID and ensure the network */ 17678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* is actually a child of this interface */ 176875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen iface = wpas_dbus_new_decompose_object_path(op, 0, &net_id, NULL); 1769d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (iface == NULL || net_id == NULL || 1770d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt os_strcmp(iface, wpa_s->dbus_new_path) != 0) { 17718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 17728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 17738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1775d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt errno = 0; 17768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt id = strtoul(net_id, NULL, 10); 1777d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (errno != 0) { 17788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 17798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 17808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 17838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 17848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_network_unknown(message); 17858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 17868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Finally, associate with the network */ 17898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_select_network(wpa_s, ssid); 17908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 17928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(iface); 17938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(net_id); 17948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 17958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 17991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * wpas_dbus_handler_network_reply - Reply to a NetworkRequest signal 18001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @message: Pointer to incoming dbus message 18011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 18021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: NULL on success or dbus error on failure 18031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * 18041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Handler function for "NetworkReply" method call of network interface. 18051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt */ 18061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry ShmidtDBusMessage * wpas_dbus_handler_network_reply(DBusMessage *message, 18071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s) 18081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 18091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef IEEE8021X_EAPOL 18101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessage *reply = NULL; 18111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const char *op, *field, *value; 18121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char *iface = NULL, *net_id = NULL; 18131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int id; 18141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_ssid *ssid; 18151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 18161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_get_args(message, NULL, 18171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_OBJECT_PATH, &op, 18181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_STRING, &field, 18191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_STRING, &value, 18201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_INVALID)) 18211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_error_invalid_args(message, NULL); 18221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 18231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Extract the network ID and ensure the network */ 18241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* is actually a child of this interface */ 18251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt iface = wpas_dbus_new_decompose_object_path(op, 0, &net_id, NULL); 1826d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (iface == NULL || net_id == NULL || 1827d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt os_strcmp(iface, wpa_s->dbus_new_path) != 0) { 18281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 18291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto out; 18301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 18311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1832d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt errno = 0; 18331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt id = strtoul(net_id, NULL, 10); 1834d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (errno != 0) { 18351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_error_invalid_args(message, net_id); 18361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto out; 18371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 18381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 18391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 18401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (ssid == NULL) { 18411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_error_network_unknown(message); 18421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto out; 18431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 18441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 18451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (wpa_supplicant_ctrl_iface_ctrl_rsp_handle(wpa_s, ssid, 18461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt field, value) < 0) 18471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_error_invalid_args(message, field); 18481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt else { 18491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Tell EAP to retry immediately */ 18501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt eapol_sm_notify_ctrl_response(wpa_s->eapol); 18511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 18521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 18531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtout: 18541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(iface); 18551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(net_id); 18561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return reply; 18571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#else /* IEEE8021X_EAPOL */ 18581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: 802.1X not included"); 18591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_error_unknown_error(message, "802.1X not included"); 18601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* IEEE8021X_EAPOL */ 18611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 18621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 18631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1864700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_BLOBS 1865700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt 18661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/** 18678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_add_blob - Store named binary blob (ie, for certificates) 18688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 18698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 18708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing an error on failure or NULL on success 18718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 18728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally store a binary blobs. 18738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 18748d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_blob(DBusMessage *message, 18758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 18768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 18788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, array_iter; 18798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *blob_name; 18818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *blob_data; 18828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int blob_len; 18838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_config_blob *blob = NULL; 18848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 18868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&iter, &blob_name); 18878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_get_blob(wpa_s->conf, blob_name)) { 18898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, 18908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPAS_DBUS_ERROR_BLOB_EXISTS, 18918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 18928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&iter); 18958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&iter, &array_iter); 18968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_fixed_array(&array_iter, &blob_data, &blob_len); 18988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = os_zalloc(sizeof(*blob)); 19008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!blob) { 19018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 19028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 19038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 19048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->data = os_malloc(blob_len); 19078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!blob->data) { 19088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 19098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 19108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 19118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(blob->data, blob_data, blob_len); 19138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->len = blob_len; 19158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->name = os_strdup(blob_name); 19168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!blob->name) { 19178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 19188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 19198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 19208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_set_blob(wpa_s->conf, blob); 19238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_blob_added(wpa_s, blob->name); 19248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 19268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr: 19288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (blob) { 19298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(blob->name); 19308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(blob->data); 19318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(blob); 19328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 19348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 19358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 19388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_blob - Get named binary blob (ie, for certificates) 19398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 19408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 19418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing array of bytes (blob) 19428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 19438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Gets one wpa_supplicant's binary blobs. 19448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 19458d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_blob(DBusMessage *message, 19468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 19478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 19488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 19498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, array_iter; 19508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *blob_name; 19528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct wpa_config_blob *blob; 19538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name, 19558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 19568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = wpa_config_get_blob(wpa_s->conf, blob_name); 19588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!blob) { 19598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, 19608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPAS_DBUS_ERROR_BLOB_UNKNOWN, 19618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Blob id not set"); 19628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 19658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!reply) { 19668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 19678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 19688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 19698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init_append(reply, &iter); 19728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, 19748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_BYTE_AS_STRING, 19758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &array_iter)) { 19768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 19778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 19788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 19798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 19808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_append_fixed_array(&array_iter, DBUS_TYPE_BYTE, 19838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &(blob->data), blob->len)) { 19848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 19858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 19868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 19878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 19888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_close_container(&iter, &array_iter)) { 19918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 19928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 19938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 19948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 19958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 19988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 19998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 20008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 20038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_remove_handler_remove_blob - Remove named binary blob 20048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 20058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 20068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error 20078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 20088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally remove a binary blobs. 20098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 20108d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_blob(DBusMessage *message, 20118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 20128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 20138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 20148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *blob_name; 20158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name, 20178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 20188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_remove_blob(wpa_s->conf, blob_name)) { 20208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, 20218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPAS_DBUS_ERROR_BLOB_UNKNOWN, 20228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Blob id not set"); 20238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_blob_removed(wpa_s, blob_name); 20258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 20278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 20298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2030700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_BLOBS */ 2031700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt 2032700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt 20338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 20348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_flush_bss - Flush the BSS cache 20358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 20368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 20378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL 20388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 20398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "FlushBSS" method call of network interface. 20408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 20418d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_flush_bss(DBusMessage *message, 20428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 20438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 20448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t age; 20458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_UINT32, &age, 20478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 20488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (age == 0) 20508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_bss_flush(wpa_s); 20518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 20528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_bss_flush_by_age(wpa_s, age); 20538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 20558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 20568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 205804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN 205904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 206004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_handler_autoscan - Set autoscan parameters for the interface 206104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @message: Pointer to incoming dbus message 206204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 206304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: NULL 206404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 206504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Handler function for "AutoScan" method call of network interface. 206604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 206704949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_autoscan(DBusMessage *message, 206804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_supplicant *wpa_s) 206904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 207004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessage *reply = NULL; 207104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt enum wpa_states state = wpa_s->wpa_state; 207204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *arg; 207304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 207404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &arg, 207504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBUS_TYPE_INVALID); 207604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 207704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (arg != NULL && os_strlen(arg) > 0) { 207804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *tmp; 207904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt tmp = os_strdup(arg); 208004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (tmp == NULL) { 208104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt reply = dbus_message_new_error(message, 208204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBUS_ERROR_NO_MEMORY, 208304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt NULL); 208404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else { 208504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(wpa_s->conf->autoscan); 208604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->conf->autoscan = tmp; 208704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (state == WPA_DISCONNECTED || state == WPA_INACTIVE) 208804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt autoscan_init(wpa_s, 1); 208904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt else if (state == WPA_SCANNING) 209004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_supplicant_reinit_autoscan(wpa_s); 209104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 209204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (arg != NULL && os_strlen(arg) == 0) { 209304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(wpa_s->conf->autoscan); 209404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->conf->autoscan = NULL; 209504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt autoscan_deinit(wpa_s); 209604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else 209704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt reply = dbus_message_new_error(message, 209804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBUS_ERROR_INVALID_ARGS, 209904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt NULL); 210004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 210104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return reply; 210204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 210304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */ 210404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 210504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 21068da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt/* 21078da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * wpas_dbus_handler_eap_logoff - IEEE 802.1X EAPOL state machine logoff 21088da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @message: Pointer to incoming dbus message 21098da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 21108da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Returns: NULL 21118da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * 21128da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Handler function for "EAPLogoff" method call of network interface. 21138da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt */ 21148da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry ShmidtDBusMessage * wpas_dbus_handler_eap_logoff(DBusMessage *message, 21158da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt struct wpa_supplicant *wpa_s) 21168da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt{ 21178da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt eapol_sm_notify_logoff(wpa_s->eapol, TRUE); 21188da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt return NULL; 21198da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt} 21208da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt 21218da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt 21228da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt/* 21238da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * wpas_dbus_handler_eap_logon - IEEE 802.1X EAPOL state machine logon 21248da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @message: Pointer to incoming dbus message 21258da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 21268da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Returns: NULL 21278da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * 21288da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Handler function for "EAPLogin" method call of network interface. 21298da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt */ 21308da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry ShmidtDBusMessage * wpas_dbus_handler_eap_logon(DBusMessage *message, 21318da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt struct wpa_supplicant *wpa_s) 21328da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt{ 21338da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt eapol_sm_notify_logoff(wpa_s->eapol, FALSE); 21348da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt return NULL; 21358da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt} 21368da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt 21378da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt 2138e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt#ifdef CONFIG_TDLS 2139e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 21407d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidtstatic int get_peer_hwaddr_helper(DBusMessage *message, const char *func_name, 21417d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt u8 *peer_address, DBusMessage **error) 2142e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 2143e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt const char *peer_string; 2144e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 21457d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt *error = NULL; 21467d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt 2147e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (!dbus_message_get_args(message, NULL, 2148e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt DBUS_TYPE_STRING, &peer_string, 21497d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt DBUS_TYPE_INVALID)) { 21507d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt *error = wpas_dbus_error_invalid_args(message, NULL); 21517d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt return -1; 21527d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt } 2153e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2154e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (hwaddr_aton(peer_string, peer_address)) { 2155e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: invalid address '%s'", 2156e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt func_name, peer_string); 21577d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt *error = wpas_dbus_error_invalid_args( 2158e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt message, "Invalid hardware address format"); 21597d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt return -1; 2160e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt } 2161e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 21627d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt return 0; 2163e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 2164e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2165e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2166e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/* 2167e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_discover - Discover TDLS peer 2168e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message 2169e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 2170e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure 2171e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * 2172e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSDiscover" method call of network interface. 2173e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */ 2174e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_discover(DBusMessage *message, 2175e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt struct wpa_supplicant *wpa_s) 2176e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 2177e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt u8 peer[ETH_ALEN]; 2178e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt DBusMessage *error_reply; 2179e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt int ret; 2180e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 21817d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0) 2182e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return error_reply; 2183e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2184e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_printf(MSG_DEBUG, "DBUS TDLS_DISCOVER " MACSTR, MAC2STR(peer)); 2185e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2186e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (wpa_tdls_is_external_setup(wpa_s->wpa)) 2187e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_tdls_send_discovery_request(wpa_s->wpa, peer); 2188e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt else 2189e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_drv_tdls_oper(wpa_s, TDLS_DISCOVERY_REQ, peer); 2190e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2191e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (ret) { 2192e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return wpas_dbus_error_unknown_error( 2193e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt message, "error performing TDLS discovery"); 2194e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt } 2195e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2196e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return NULL; 2197e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 2198e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2199e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2200e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/* 2201e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_setup - Setup TDLS session 2202e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message 2203e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 2204e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure 2205e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * 2206e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSSetup" method call of network interface. 2207e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */ 2208e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_setup(DBusMessage *message, 2209e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt struct wpa_supplicant *wpa_s) 2210e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 2211e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt u8 peer[ETH_ALEN]; 2212e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt DBusMessage *error_reply; 2213e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt int ret; 2214e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 22157d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0) 2216e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return error_reply; 2217e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2218e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_printf(MSG_DEBUG, "DBUS TDLS_SETUP " MACSTR, MAC2STR(peer)); 2219e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2220e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_tdls_remove(wpa_s->wpa, peer); 2221e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (wpa_tdls_is_external_setup(wpa_s->wpa)) 2222e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_tdls_start(wpa_s->wpa, peer); 2223e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt else 2224e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_drv_tdls_oper(wpa_s, TDLS_SETUP, peer); 2225e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2226e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (ret) { 2227e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return wpas_dbus_error_unknown_error( 2228e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt message, "error performing TDLS setup"); 2229e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt } 2230e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2231e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return NULL; 2232e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 2233e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2234e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2235e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/* 2236e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_status - Return TDLS session status 2237e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message 2238e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 2239e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: A string representing the state of the link to this TDLS peer 2240e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * 2241e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSStatus" method call of network interface. 2242e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */ 2243e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_status(DBusMessage *message, 2244e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt struct wpa_supplicant *wpa_s) 2245e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 2246e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt u8 peer[ETH_ALEN]; 2247e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt DBusMessage *reply; 2248e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt const char *tdls_status; 2249e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 22507d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt if (get_peer_hwaddr_helper(message, __func__, peer, &reply) < 0) 2251e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return reply; 2252e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2253e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_printf(MSG_DEBUG, "DBUS TDLS_STATUS " MACSTR, MAC2STR(peer)); 2254e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2255e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt tdls_status = wpa_tdls_get_link_status(wpa_s->wpa, peer); 2256e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2257e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt reply = dbus_message_new_method_return(message); 2258e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt dbus_message_append_args(reply, DBUS_TYPE_STRING, 2259e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt &tdls_status, DBUS_TYPE_INVALID); 2260e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return reply; 2261e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 2262e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2263e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2264e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/* 2265e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_teardown - Teardown TDLS session 2266e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message 2267e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 2268e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure 2269e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * 2270e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSTeardown" method call of network interface. 2271e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */ 2272e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_teardown(DBusMessage *message, 2273e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt struct wpa_supplicant *wpa_s) 2274e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 2275e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt u8 peer[ETH_ALEN]; 2276e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt DBusMessage *error_reply; 2277e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt int ret; 2278e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 22797d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0) 2280e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return error_reply; 2281e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2282e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_printf(MSG_DEBUG, "DBUS TDLS_TEARDOWN " MACSTR, MAC2STR(peer)); 2283e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2284e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (wpa_tdls_is_external_setup(wpa_s->wpa)) 2285e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_tdls_teardown_link( 2286e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_s->wpa, peer, 2287e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED); 2288e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt else 2289e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_drv_tdls_oper(wpa_s, TDLS_TEARDOWN, peer); 2290e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2291e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (ret) { 2292e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return wpas_dbus_error_unknown_error( 2293e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt message, "error performing TDLS teardown"); 2294e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt } 2295e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2296e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return NULL; 2297e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 2298e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2299e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt#endif /* CONFIG_TDLS */ 2300e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2301e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 23028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 230301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_handler_set_pkcs11_engine_and_module_path - Set PKCS #11 engine and module path 230401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @message: Pointer to incoming dbus message 230501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 230601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing an error on failure or NULL on success 230701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * 230801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Sets the PKCS #11 engine and module path. 230901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */ 231001904cfafd75a70b9f29c0220b90bdef45595491Dmitry ShmidtDBusMessage * wpas_dbus_handler_set_pkcs11_engine_and_module_path( 231101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt DBusMessage *message, struct wpa_supplicant *wpa_s) 231201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{ 231301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt DBusMessageIter iter; 231401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt char *value = NULL; 231501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt char *pkcs11_engine_path = NULL; 231601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt char *pkcs11_module_path = NULL; 231701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 231801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt dbus_message_iter_init(message, &iter); 231901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt dbus_message_iter_get_basic(&iter, &value); 232001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (value == NULL) { 232101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return dbus_message_new_error( 232201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt message, DBUS_ERROR_INVALID_ARGS, 232301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt "Invalid pkcs11_engine_path argument"); 232401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt } 232501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt /* Empty path defaults to NULL */ 232601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (os_strlen(value)) 232701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_engine_path = value; 232801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 232901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt dbus_message_iter_next(&iter); 233001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt dbus_message_iter_get_basic(&iter, &value); 233101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (value == NULL) { 233201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt os_free(pkcs11_engine_path); 233301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return dbus_message_new_error( 233401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt message, DBUS_ERROR_INVALID_ARGS, 233501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt "Invalid pkcs11_module_path argument"); 233601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt } 233701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt /* Empty path defaults to NULL */ 233801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (os_strlen(value)) 233901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_module_path = value; 234001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 234101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (wpas_set_pkcs11_engine_and_module_path(wpa_s, pkcs11_engine_path, 234201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_module_path)) 234301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return dbus_message_new_error( 234401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt message, DBUS_ERROR_FAILED, 234501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt "Reinit of the EAPOL state machine with the new PKCS " 234601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt "#11 engine and module path failed."); 234701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 234801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt wpa_dbus_mark_property_changed( 234901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt wpa_s->global->dbus, wpa_s->dbus_new_path, 235001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11EnginePath"); 235101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt wpa_dbus_mark_property_changed( 235201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt wpa_s->global->dbus, wpa_s->dbus_new_path, 235301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11ModulePath"); 235401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 235501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return NULL; 235601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt} 235701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 235801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 235901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/** 23608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_capabilities - Return interface capabilities 23611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 23621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 23631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 23641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 23658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 23668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Capabilities" property of an interface. 23678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 23681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_capabilities(DBusMessageIter *iter, 23691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 23708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 23711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 23728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_capa capa; 23738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 23741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter iter_dict, iter_dict_entry, iter_dict_val, iter_array, 23758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt variant_iter; 23768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *scans[] = { "active", "passive", "ssid" }; 23778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 23798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "a{sv}", &variant_iter)) 23808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 23818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict)) 23838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 23848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = wpa_drv_get_capa(wpa_s, &capa); 23868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** pairwise cipher */ 23888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 23898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = {"ccmp", "tkip", "none"}; 23908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 23918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "Pairwise", args, 239268d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(args))) 23938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 23948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 23958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Pairwise", 23968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 23978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 23988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 23998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2401fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_CCMP_256) { 2402fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 2403fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt &iter_array, "ccmp-256")) 2404fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt goto nomem; 2405fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt } 2406fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 2407fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_GCMP_256) { 2408fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 2409fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt &iter_array, "gcmp-256")) 2410fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt goto nomem; 2411fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt } 2412fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 24138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) { 24148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 24158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "ccmp")) 24168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 241961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_GCMP) { 242061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 242161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt &iter_array, "gcmp")) 242261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto nomem; 242361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 242461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 24258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) { 24268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 24278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "tkip")) 24288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) { 24328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 24338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "none")) 24348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_end_string_array(&iter_dict, 24388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 24398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 24408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 24418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** group cipher */ 24458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 24468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { 24478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "ccmp", "tkip", "wep104", "wep40" 24488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }; 24498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 24508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "Group", args, 245168d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(args))) 24528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 24548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Group", 24558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 24568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 24578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 24588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2460fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_CCMP_256) { 2461fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 2462fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt &iter_array, "ccmp-256")) 2463fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt goto nomem; 2464fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt } 2465fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 2466fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_GCMP_256) { 2467fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 2468fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt &iter_array, "gcmp-256")) 2469fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt goto nomem; 2470fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt } 2471fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 24728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) { 24738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 24748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "ccmp")) 24758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 247861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_GCMP) { 247961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 248061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt &iter_array, "gcmp")) 248161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto nomem; 248261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 248361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 24848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) { 24858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 24868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "tkip")) 24878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_WEP104) { 24918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 24928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wep104")) 24938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_WEP40) { 24978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 24988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wep40")) 24998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_end_string_array(&iter_dict, 25038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 25048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 25058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 25068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** key management */ 25108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 25118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { 25128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa-psk", "wpa-eap", "ieee8021x", "wpa-none", 25138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 25148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wps", 25158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 25168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "none" 25178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }; 25188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 25198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "KeyMgmt", args, 252068d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(args))) 25218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 25238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "KeyMgmt", 25248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 25258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 25268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 25278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element(&iter_array, 25308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "none")) 25318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element(&iter_array, 25348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "ieee8021x")) 25358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA | 25388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2)) { 25398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 25408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-eap")) 25418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_FT) 25448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 25458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-ft-eap")) 25468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */ 25498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 25508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 25518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-eap-sha256")) 25528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 25548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK | 25578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) { 25588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 25598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-psk")) 25608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_FT_PSK) 25638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 25648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-ft-psk")) 25658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */ 25688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 25698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 25708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-psk-sha256")) 25718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 25738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) { 25768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 25778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-none")) 25788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 25838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element(&iter_array, 25848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wps")) 25858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 25878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_end_string_array(&iter_dict, 25898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 25908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 25918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 25928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** WPA protocol */ 25968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 25978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { "rsn", "wpa" }; 25988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 25998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "Protocol", args, 260068d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(args))) 26018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 26028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 26038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Protocol", 26048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 26058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 26068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 26078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 26088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA2 | 26108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) { 26118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 26128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "rsn")) 26138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 26148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA | 26178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK)) { 26188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 26198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa")) 26208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 26218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_end_string_array(&iter_dict, 26248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 26258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 26268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 26278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 26288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** auth alg */ 26318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 26328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { "open", "shared", "leap" }; 26338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 26348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "AuthAlg", args, 263568d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(args))) 26368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 26378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 26388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "AuthAlg", 26398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 26408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 26418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 26428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 26438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.auth & (WPA_DRIVER_AUTH_OPEN)) { 26458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 26468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "open")) 26478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 26488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.auth & (WPA_DRIVER_AUTH_SHARED)) { 26518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 26528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "shared")) 26538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 26548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.auth & (WPA_DRIVER_AUTH_LEAP)) { 26578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 26588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "leap")) 26598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 26608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_end_string_array(&iter_dict, 26638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 26648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 26658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 26668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 26678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** Scan */ 26708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array(&iter_dict, "Scan", scans, 267168d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(scans))) 26728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 26738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** Modes */ 267575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Modes", 267675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_entry, 267775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_val, 267875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_array)) 26798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 26808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 268175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!wpa_dbus_dict_string_array_add_element( 268275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_array, "infrastructure")) 268375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen goto nomem; 268475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen 268575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!wpa_dbus_dict_string_array_add_element( 268675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_array, "ad-hoc")) 268775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen goto nomem; 268875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen 268975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (res >= 0) { 269075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (capa.flags & (WPA_DRIVER_FLAGS_AP)) { 269175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!wpa_dbus_dict_string_array_add_element( 269275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_array, "ap")) 269375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen goto nomem; 269475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen } 269575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen 269675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (capa.flags & (WPA_DRIVER_FLAGS_P2P_CAPABLE)) { 269775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!wpa_dbus_dict_string_array_add_element( 269875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_array, "p2p")) 269975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen goto nomem; 270075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen } 270175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen } 270275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen 270375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!wpa_dbus_dict_end_string_array(&iter_dict, 270475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_entry, 270575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_val, 270675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_array)) 270775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen goto nomem; 270875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen /***** Modes end */ 270975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen 27101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (res >= 0) { 27111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_int32_t max_scan_ssid = capa.max_scan_ssids; 27121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 27131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpa_dbus_dict_append_int32(&iter_dict, "MaxScanSSID", 27141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt max_scan_ssid)) 27151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto nomem; 27161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 27171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 27188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict)) 27198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 27201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_close_container(iter, &variant_iter)) 27218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 27228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 27248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem: 27261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 27271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 27288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 27328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_state - Get interface state 27331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 27341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 27351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 27361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 27378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 27388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "State" property. 27398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 27401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_state(DBusMessageIter *iter, DBusError *error, 27411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 27428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 27431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 27448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *str_state; 27458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *state_ls, *tmp; 27461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 27478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt str_state = wpa_supplicant_state_txt(wpa_s->wpa_state); 27498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* make state string lowercase to fit new DBus API convention 27518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 27528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt state_ls = tmp = os_strdup(str_state); 27538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!tmp) { 27541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 27551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 27568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 27578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*tmp) { 27588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *tmp = tolower(*tmp); 27598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tmp++; 27608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 27618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 27631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &state_ls, error); 27648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(state_ls); 27668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 27688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 27728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_get_scanning - Get interface scanning state 27731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 27741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 27751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 27761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 27778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 27788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "scanning" property. 27798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 27801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_scanning(DBusMessageIter *iter, DBusError *error, 27811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 27828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 27831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 27848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t scanning = wpa_s->scanning ? TRUE : FALSE; 27851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 27861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 27871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &scanning, error); 27888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 27928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ap_scan - Control roaming mode 27931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 27941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 27951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 27961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 27978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 27988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "ApScan" property. 27998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 28001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_ap_scan(DBusMessageIter *iter, DBusError *error, 28011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 28028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 28031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 28048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t ap_scan = wpa_s->conf->ap_scan; 28051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 28061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, 28071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &ap_scan, error); 28088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 28098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 28128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_ap_scan - Control roaming mode 28131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 28141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 28151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 28161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 28178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 28188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "ApScan" property. 28198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 28201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_ap_scan(DBusMessageIter *iter, DBusError *error, 28211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 28228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 28231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 28248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t ap_scan; 28258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32, 28271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &ap_scan)) 28281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 28298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_set_ap_scan(wpa_s, ap_scan)) { 28311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 28321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "ap_scan must be 0, 1, or 2"); 28331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 28348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 28351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 28368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 28378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 2840c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * wpas_dbus_getter_fast_reauth - Control fast 2841c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * reauthentication (TLS session resumption) 2842c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 2843c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @error: Location to store error on failure 2844c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @user_data: Function specific data 2845c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Returns: TRUE on success, FALSE on failure 2846c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * 2847c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Getter function for "FastReauth" property. 2848c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt */ 2849c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidtdbus_bool_t wpas_dbus_getter_fast_reauth(DBusMessageIter *iter, 2850c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt DBusError *error, 2851c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt void *user_data) 2852c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt{ 2853c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 2854c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt dbus_bool_t fast_reauth = wpa_s->conf->fast_reauth ? TRUE : FALSE; 2855c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2856c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 2857c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt &fast_reauth, error); 2858c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt} 2859c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2860c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2861c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt/** 2862c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * wpas_dbus_setter_fast_reauth - Control fast 2863c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * reauthentication (TLS session resumption) 2864c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 2865c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @error: Location to store error on failure 2866c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @user_data: Function specific data 2867c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Returns: TRUE on success, FALSE on failure 2868c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * 2869c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Setter function for "FastReauth" property. 2870c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt */ 2871c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidtdbus_bool_t wpas_dbus_setter_fast_reauth(DBusMessageIter *iter, 2872c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt DBusError *error, 2873c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt void *user_data) 2874c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt{ 2875c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 2876c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt dbus_bool_t fast_reauth; 2877c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2878c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, 2879c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt &fast_reauth)) 2880c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return FALSE; 2881c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2882c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt wpa_s->conf->fast_reauth = fast_reauth; 2883c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return TRUE; 2884c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt} 2885c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2886c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2887c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt/** 288804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_getter_disconnect_reason - Get most recent reason for disconnect 288904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 289004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure 289104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data 289204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 289304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 289404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Getter for "DisconnectReason" property. The reason is negative if it is 289504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * locally generated. 289604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 289704949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_getter_disconnect_reason(DBusMessageIter *iter, 289804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusError *error, 289904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt void *user_data) 290004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 290104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 290204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_int32_t reason = wpa_s->disconnect_reason; 290304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32, 290404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt &reason, error); 290504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 290604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 290704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 290804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 29098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_age - Get BSS entry expiration age 29101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 29111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 29121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 29131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 29148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 29158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "BSSExpireAge" property. 29168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 29171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_expire_age(DBusMessageIter *iter, 29181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 29191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 29208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 29211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 29228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t expire_age = wpa_s->conf->bss_expiration_age; 29231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 29241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, 29251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &expire_age, error); 29268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 29278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 29308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_age - Control BSS entry expiration age 29311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 29321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 29331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 29341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 29358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 29368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "BSSExpireAge" property. 29378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 29381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_bss_expire_age(DBusMessageIter *iter, 29391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 29401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 29418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 29421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 29438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t expire_age; 29448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32, 29461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &expire_age)) 29471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 29488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_set_bss_expiration_age(wpa_s, expire_age)) { 29501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 29511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "BSSExpireAge must be >= 10"); 29521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 29538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 29541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 29558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 29568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 29598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_count - Get BSS entry expiration scan count 29601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 29611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 29621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 29631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 29648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 29658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "BSSExpireCount" property. 29668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 29671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_expire_count(DBusMessageIter *iter, 29681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 29691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 29708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 29711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 297261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt dbus_uint32_t expire_count = wpa_s->conf->bss_expiration_scan_count; 29731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 29741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, 29751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &expire_count, error); 29768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 29778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 29808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_count - Control BSS entry expiration scan count 29811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 29821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 29831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 29841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 29858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 29868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "BSSExpireCount" property. 29878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 29881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_bss_expire_count(DBusMessageIter *iter, 29891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 29901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 29918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 29921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 29938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t expire_count; 29948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32, 29961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &expire_count)) 29971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 29988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_set_bss_expiration_count(wpa_s, expire_count)) { 30001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 30011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "BSSExpireCount must be > 0"); 30021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 30038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 30041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 30058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 30098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_country - Control country code 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 function for "Country" property. 30168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 30171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_country(DBusMessageIter *iter, DBusError *error, 30181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 30198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 30218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char country[3]; 30228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *str = country; 30238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt country[0] = wpa_s->conf->country[0]; 30258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt country[1] = wpa_s->conf->country[1]; 30268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt country[2] = '\0'; 30278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 30291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &str, error); 30308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 30348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_country - Control country code 30351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 30361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 30371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 30381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 30398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 30408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "Country" property. 30418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 30421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_country(DBusMessageIter *iter, DBusError *error, 30431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 30448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 30468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *country; 30478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING, 30491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &country)) 30501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 30518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!country[0] || !country[1]) { 30531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 30541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "invalid country code"); 30551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 30561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 30578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->drv_priv != NULL && wpa_drv_set_country(wpa_s, country)) { 30598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "Failed to set country"); 30601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 30611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "failed to set country code"); 30621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 30638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 30648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->conf->country[0] = country[0]; 30668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->conf->country[1] = country[1]; 30671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 30688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 307204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_getter_scan_interval - Get scan interval 307304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 307404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure 307504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data 307604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 307704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 307804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Getter function for "ScanInterval" property. 307904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 308004949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_getter_scan_interval(DBusMessageIter *iter, 308104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusError *error, 308204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt void *user_data) 308304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 308404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 308504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_int32_t scan_interval = wpa_s->scan_interval; 308604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 308704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32, 308804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt &scan_interval, error); 308904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 309004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 309104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 309204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 309304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_setter_scan_interval - Control scan interval 309404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 309504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure 309604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data 309704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 309804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 309904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Setter function for "ScanInterval" property. 310004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 310104949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_setter_scan_interval(DBusMessageIter *iter, 310204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusError *error, 310304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt void *user_data) 310404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 310504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 310604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_int32_t scan_interval; 310704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 310804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_INT32, 310904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt &scan_interval)) 311004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 311104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 311204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_supplicant_set_scan_interval(wpa_s, scan_interval)) { 311304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 311404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "scan_interval must be >= 0"); 311504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 311604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 311704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return TRUE; 311804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 311904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 312004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 312104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 31228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ifname - Get interface name 31231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 31241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 31251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 31261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 31278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 31288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Ifname" property. 31298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 31301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_ifname(DBusMessageIter *iter, DBusError *error, 31311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 31328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 31348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *ifname = wpa_s->ifname; 31351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 31361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 31371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &ifname, error); 31388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 31428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_driver - Get interface name 31431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 31441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 31451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 31461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 31478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 31488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Driver" property. 31498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 31501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_driver(DBusMessageIter *iter, DBusError *error, 31511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 31528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 31548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *driver; 31558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->driver == NULL || wpa_s->driver->name == NULL) { 31578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_getter_driver[dbus]: " 31588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa_s has no driver set"); 31591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, "%s: no driver set", 31601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt __func__); 31611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 31628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 31638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt driver = wpa_s->driver->name; 31651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 31661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &driver, error); 31678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 31718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_bss - Get current bss object path 31721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 31731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 31741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 31751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 31768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 31778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentBSS" property. 31788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 31791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_bss(DBusMessageIter *iter, 31801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 31811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 31828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 31848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *bss_obj_path = path_buf; 31858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->current_bss) 31878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, 31888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u", 31898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, wpa_s->current_bss->id); 31908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 31918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/"); 31928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_OBJECT_PATH, 31941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &bss_obj_path, error); 31958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 31998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_network - Get current network object path 32001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 32011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 32021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 32031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 32048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 32058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentNetwork" property. 32068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 32071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_network(DBusMessageIter *iter, 32081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 32091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 32108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 32111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 32128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *net_obj_path = path_buf; 32138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->current_ssid) 32158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, 32168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u", 32178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, wpa_s->current_ssid->id); 32188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 32198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/"); 32208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_OBJECT_PATH, 32221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &net_obj_path, error); 32238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 32248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 32278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_auth_mode - Get current authentication type 32281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 32291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 32301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 32311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 32328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 32338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentAuthMode" property. 32348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 32351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_auth_mode(DBusMessageIter *iter, 32361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 32371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 32388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 32391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 32408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *eap_mode; 32418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *auth_mode; 32428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char eap_mode_buf[WPAS_DBUS_AUTH_MODE_MAX]; 32438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->wpa_state != WPA_COMPLETED) { 32458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt auth_mode = "INACTIVE"; 32468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X || 32478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) { 32488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eap_mode = wpa_supplicant_get_eap_mode(wpa_s); 32498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(eap_mode_buf, WPAS_DBUS_AUTH_MODE_MAX, 32508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "EAP-%s", eap_mode); 32518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt auth_mode = eap_mode_buf; 32528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 32548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt auth_mode = wpa_key_mgmt_txt(wpa_s->key_mgmt, 32558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->current_ssid->proto); 32568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 32578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 32591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &auth_mode, error); 32608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 32618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 32648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bridge_ifname - Get interface name 32651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 32661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 32671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 32681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 32698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 32708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BridgeIfname" property. 32718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 32721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bridge_ifname(DBusMessageIter *iter, 32731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 32741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 32758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 32761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 32771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const char *bridge_ifname = wpa_s->bridge_ifname; 32781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 32791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &bridge_ifname, error); 32808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 32818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 32848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bsss - Get array of BSSs objects 32851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 32861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 32871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 32881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 32898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 32908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSs" property. 32918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 32921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bsss(DBusMessageIter *iter, DBusError *error, 32931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 32948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 32951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 32968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_bss *bss; 32978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **paths; 32988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int i = 0; 32991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 33008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 330161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt paths = os_calloc(wpa_s->num_bss, sizeof(char *)); 33028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!paths) { 33031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 33041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 33058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Loop through scan results and append each result's object path */ 33088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dl_list_for_each(bss, &wpa_s->bss_id, struct wpa_bss, list_id) { 33098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX); 33108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (paths[i] == NULL) { 33111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, 33121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "no memory"); 33138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 33148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Construct the object path for this BSS. */ 33168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX, 33178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u", 33188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, bss->id); 33198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, 33221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_OBJECT_PATH, 33231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt paths, wpa_s->num_bss, 33241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 33258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 33278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (i) 33288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths[--i]); 33298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths); 33301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 33318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 33328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 33358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_networks - Get array of networks objects 33361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 33371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 33381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 33391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 33408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 33418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Networks" property. 33428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 33431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_networks(DBusMessageIter *iter, DBusError *error, 33441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 33458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 33461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 33478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 33488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **paths; 33498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int i = 0, num = 0; 33501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 33518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->conf == NULL) { 33531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_ERROR, "%s[dbus]: An error occurred getting " 33541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "networks list.", __func__); 33551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, "%s: an error " 33561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "occurred getting the networks list", __func__); 33571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 33588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) 336175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!network_is_persistent_group(ssid)) 336275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen num++; 33638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 336461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt paths = os_calloc(num, sizeof(char *)); 33658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!paths) { 33661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_NO_MEMORY, "no memory"); 33671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 33688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Loop through configured networks and append object path of each */ 33718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) { 337275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (network_is_persistent_group(ssid)) 337375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen continue; 33748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX); 33758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (paths[i] == NULL) { 33761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_NO_MEMORY, "no memory"); 33778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 33788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Construct the object path for this network. */ 33818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX, 33828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d", 33838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, ssid->id); 33848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, 33871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_OBJECT_PATH, 33881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt paths, num, error); 33898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 33918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (i) 33928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths[--i]); 33938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths); 33941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 33958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 33968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 339901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_getter_pkcs11_engine_path - Get PKCS #11 engine path 340001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 340101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @error: Location to store error on failure 340201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @user_data: Function specific data 340301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing the PKCS #11 engine path 340401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * 340501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Getter for "PKCS11EnginePath" property. 340601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */ 340701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidtdbus_bool_t wpas_dbus_getter_pkcs11_engine_path(DBusMessageIter *iter, 340801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt DBusError *error, 340901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt void *user_data) 341001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{ 341101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 341201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt const char *pkcs11_engine_path; 341301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 341401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (wpa_s->conf == NULL) { 341501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt wpa_printf(MSG_ERROR, 341601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt "wpas_dbus_getter_pkcs11_engine_path[dbus]: An " 341701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt "error occurred getting the PKCS #11 engine path."); 341801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt dbus_set_error_const( 341901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt error, DBUS_ERROR_FAILED, 342001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt "An error occured getting the PKCS #11 engine path."); 342101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return FALSE; 342201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt } 342301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 342401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (wpa_s->conf->pkcs11_engine_path == NULL) 342501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_engine_path = ""; 342601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt else 342701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_engine_path = wpa_s->conf->pkcs11_engine_path; 342801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 342901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt &pkcs11_engine_path, error); 343001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt} 343101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 343201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 343301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/** 343401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_getter_pkcs11_module_path - Get PKCS #11 module path 343501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 343601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @error: Location to store error on failure 343701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @user_data: Function specific data 343801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing the PKCS #11 module path 343901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * 344001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Getter for "PKCS11ModulePath" property. 344101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */ 344201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidtdbus_bool_t wpas_dbus_getter_pkcs11_module_path(DBusMessageIter *iter, 344301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt DBusError *error, 344401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt void *user_data) 344501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{ 344601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 344701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt const char *pkcs11_module_path; 344801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 344901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (wpa_s->conf == NULL) { 345001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt wpa_printf(MSG_ERROR, 345101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt "wpas_dbus_getter_pkcs11_module_path[dbus]: An " 345201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt "error occurred getting the PKCS #11 module path."); 345301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt dbus_set_error_const( 345401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt error, DBUS_ERROR_FAILED, 345501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt "An error occured getting the PKCS #11 module path."); 345601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return FALSE; 345701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt } 345801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 345901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (wpa_s->conf->pkcs11_module_path == NULL) 346001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_module_path = ""; 346101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt else 346201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_module_path = wpa_s->conf->pkcs11_module_path; 346301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 346401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt &pkcs11_module_path, error); 346501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt} 346601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 346701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 346801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/** 34698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_blobs - Get all blobs defined for this interface 34701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 34711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 34721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 34731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 34748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 34758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Blobs" property. 34768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 34771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_blobs(DBusMessageIter *iter, DBusError *error, 34781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 34798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 34801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 34811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter, dict_iter, entry_iter, array_iter; 34828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_config_blob *blob; 34838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 34858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "a{say}", &variant_iter) || 34868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY, 34878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "{say}", &dict_iter)) { 34881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 34891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 34908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 34918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = wpa_s->conf->blobs; 34938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (blob) { 34948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_open_container(&dict_iter, 34958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_DICT_ENTRY, 34968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL, &entry_iter) || 34978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_append_basic(&entry_iter, 34988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_STRING, 34998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &(blob->name)) || 35008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_open_container(&entry_iter, 35018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_ARRAY, 35028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_BYTE_AS_STRING, 35038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &array_iter) || 35048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_append_fixed_array(&array_iter, 35058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_BYTE, 35068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &(blob->data), 35078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->len) || 35088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_close_container(&entry_iter, 35098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &array_iter) || 35108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_close_container(&dict_iter, 35118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &entry_iter)) { 35121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, 35131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "no memory"); 35141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 35158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 35168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = blob->next; 35188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 35198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_close_container(&variant_iter, &dict_iter) || 35211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) { 35221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 35231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 35248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 35258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 35271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 35281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 35291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 35301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic struct wpa_bss * get_bss_helper(struct bss_handler_args *args, 35311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, const char *func_name) 35321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 35331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res = wpa_bss_get_id(args->wpa_s, args->id); 35341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 35351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) { 35361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_ERROR, "%s[dbus]: no bss with id %d found", 35371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt func_name, args->id); 35381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 35391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: BSS %d not found", 35401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt func_name, args->id); 35411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 35421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 35431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return res; 35448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 35488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_bssid - Return the BSSID of a BSS 35491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 35501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 35511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 35521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 35538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 35548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSID" property. 35558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 35561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_bssid(DBusMessageIter *iter, DBusError *error, 35571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 35588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 35601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 35618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 35631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 35641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 35658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE, 35671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res->bssid, ETH_ALEN, 35681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 35698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 35738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ssid - Return the SSID of a BSS 35741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 35751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 35761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 35771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 35788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 35798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "SSID" property. 35808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 35811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_ssid(DBusMessageIter *iter, DBusError *error, 35821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 35838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 35851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 35868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 35881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 35891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 35908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE, 35921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res->ssid, res->ssid_len, 35931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 35948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 35988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_privacy - Return the privacy flag of a BSS 35991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 36001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 36011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 36021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 36038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 36048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Privacy" property. 36058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 36061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_privacy(DBusMessageIter *iter, 36071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 36088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 36091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 36101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 36118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t privacy; 36128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 36141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 36151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 36168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt privacy = (res->caps & IEEE80211_CAP_PRIVACY) ? TRUE : FALSE; 36181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 36191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &privacy, error); 36208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 36218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 36248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_mode - Return the mode of a BSS 36251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 36261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 36271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 36281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 36298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 36308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Mode" property. 36318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 36321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_mode(DBusMessageIter *iter, DBusError *error, 36331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 36348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 36351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 36361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 36378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *mode; 36388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 36401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 36411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 364276cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt if (bss_is_dmg(res)) { 364376cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt switch (res->caps & IEEE80211_CAP_DMG_MASK) { 364476cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt case IEEE80211_CAP_DMG_PBSS: 364576cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt case IEEE80211_CAP_DMG_IBSS: 364676cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt mode = "ad-hoc"; 364776cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt break; 364876cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt case IEEE80211_CAP_DMG_AP: 364976cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt mode = "infrastructure"; 365076cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt break; 365176cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt } 365276cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt } else { 365376cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt if (res->caps & IEEE80211_CAP_IBSS) 365476cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt mode = "ad-hoc"; 365576cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt else 365676cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt mode = "infrastructure"; 365776cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt } 36588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 36601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &mode, error); 36618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 36628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 36658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_level - Return the signal strength of a BSS 36661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 36671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 36681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 36691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 36708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 36718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Level" property. 36728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 36731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_signal(DBusMessageIter *iter, 36741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 36758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 36761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 36771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 3678c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt s16 level; 36798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 36811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 36821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 36838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3684c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt level = (s16) res->level; 36851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT16, 3686c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt &level, error); 36878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 36888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 36918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_frequency - Return the frequency of a BSS 36921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 36931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 36941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 36951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 36968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 36978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Frequency" property. 36988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 36991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_frequency(DBusMessageIter *iter, 37001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 37018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 37021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 37031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 3704c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt u16 freq; 37058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 37071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 37081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 37098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3710c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt freq = (u16) res->freq; 37111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT16, 3712c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt &freq, error); 37138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 37148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int cmp_u8s_desc(const void *a, const void *b) 37178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 37188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return (*(u8 *) b - *(u8 *) a); 37198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 37208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 37238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rates - Return available bit rates of a BSS 37241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 37251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 37261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 37271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 37288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 37298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Rates" property. 37308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 37311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_rates(DBusMessageIter *iter, 37321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 37338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 37341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 37351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 37368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *ie_rates = NULL; 37378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u32 *real_rates; 37388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int rates_num, i; 37391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 37408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 37421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 37431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 37448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt rates_num = wpa_bss_get_bit_rates(res, &ie_rates); 37468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (rates_num < 0) 37471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 37488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt qsort(ie_rates, rates_num, 1, cmp_u8s_desc); 37508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt real_rates = os_malloc(sizeof(u32) * rates_num); 37528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!real_rates) { 37538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ie_rates); 37541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 37551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 37568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 37578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < rates_num; i++) 37598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt real_rates[i] = ie_rates[i] * 500000; 37608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_UINT32, 37621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt real_rates, rates_num, 37631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 37648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ie_rates); 37668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(real_rates); 37671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 37688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 37698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic dbus_bool_t wpas_dbus_get_bss_security_prop(DBusMessageIter *iter, 37721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_ie_data *ie_data, 37731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error) 37748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 37751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter iter_dict, variant_iter; 37768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *group; 3777fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt const char *pairwise[5]; /* max 5 pairwise ciphers is supported */ 37788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *key_mgmt[7]; /* max 7 key managements may be supported */ 37798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int n; 37808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 37828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "a{sv}", &variant_iter)) 37838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 37848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict)) 37868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 37878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* KeyMgmt */ 37898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt n = 0; 37908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK) 37918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-psk"; 37928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_PSK) 37938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-ft-psk"; 37948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK_SHA256) 37958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-psk-sha256"; 37968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X) 37978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-eap"; 37988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X) 37998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-ft-eap"; 38008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256) 38018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-eap-sha256"; 38028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_NONE) 38038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-none"; 38048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array(&iter_dict, "KeyMgmt", 38068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt, n)) 38078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 38088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Group */ 38108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (ie_data->group_cipher) { 38118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_WEP40: 38128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "wep40"; 38138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 38148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_TKIP: 38158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "tkip"; 38168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 38178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_CCMP: 38188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "ccmp"; 38198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 382061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt case WPA_CIPHER_GCMP: 382161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt group = "gcmp"; 382261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt break; 38238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_WEP104: 38248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "wep104"; 38258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 3826fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt case WPA_CIPHER_CCMP_256: 3827fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt group = "ccmp-256"; 3828fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt break; 3829fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt case WPA_CIPHER_GCMP_256: 3830fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt group = "gcmp-256"; 3831fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt break; 38328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 38338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = ""; 38348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 38358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 38368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string(&iter_dict, "Group", group)) 38388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 38398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Pairwise */ 38418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt n = 0; 38428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_TKIP) 38438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pairwise[n++] = "tkip"; 38448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_CCMP) 38458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pairwise[n++] = "ccmp"; 384661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_GCMP) 384761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pairwise[n++] = "gcmp"; 3848fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_CCMP_256) 3849fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt pairwise[n++] = "ccmp-256"; 3850fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_GCMP_256) 3851fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt pairwise[n++] = "gcmp-256"; 38528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array(&iter_dict, "Pairwise", 38548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pairwise, n)) 38558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 38568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Management group (RSN only) */ 38588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->proto == WPA_PROTO_RSN) { 38598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (ie_data->mgmt_group_cipher) { 38608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 38618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_AES_128_CMAC: 38628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "aes128cmac"; 38638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 38648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 38658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 38668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = ""; 38678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 38688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 38698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string(&iter_dict, "MgmtGroup", 38718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group)) 38728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 38738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 38748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict)) 38768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 38771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_close_container(iter, &variant_iter)) 38788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 38798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 38818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem: 38831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 38841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 38858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 38868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 38898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_wpa - Return the WPA options of a BSS 38901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 38911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 38921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 38931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 38948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 38958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "WPA" property. 38968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 38971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_wpa(DBusMessageIter *iter, DBusError *error, 38981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 38998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 39001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 39011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 39028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ie_data wpa_data; 39038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *ie; 39048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 39061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 39071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 39088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&wpa_data, 0, sizeof(wpa_data)); 39108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie = wpa_bss_get_vendor_ie(res, WPA_IE_VENDOR_TYPE); 39118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie) { 39121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0) { 39131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 39141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "failed to parse WPA IE"); 39151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 39161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 39178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 39188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_get_bss_security_prop(iter, &wpa_data, error); 39208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 39218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 39248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rsn - Return the RSN options of a BSS 39251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 39261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 39271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 39281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 39298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 39308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "RSN" property. 39318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 39321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_rsn(DBusMessageIter *iter, DBusError *error, 39331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 39348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 39351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 39361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 39378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ie_data wpa_data; 39388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *ie; 39398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 39411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 39421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 39438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&wpa_data, 0, sizeof(wpa_data)); 39458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie = wpa_bss_get_ie(res, WLAN_EID_RSN); 39468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie) { 39471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0) { 39481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 39491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "failed to parse RSN IE"); 39501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 39511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 39528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 39538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_get_bss_security_prop(iter, &wpa_data, error); 39558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 39568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 3959d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * wpas_dbus_getter_bss_wps - Return the WPS options of a BSS 3960d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @iter: Pointer to incoming dbus message iter 3961d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @error: Location to store error on failure 3962d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @user_data: Function specific data 3963d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Returns: TRUE on success, FALSE on failure 3964d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * 3965d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Getter for "WPS" property. 3966d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt */ 3967d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_wps(DBusMessageIter *iter, DBusError *error, 3968d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt void *user_data) 3969d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{ 3970d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt struct bss_handler_args *args = user_data; 3971d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt struct wpa_bss *res; 3972d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_WPS 3973d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt struct wpabuf *wps_ie; 3974d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_WPS */ 3975d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt DBusMessageIter iter_dict, variant_iter; 3976d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt const char *type = ""; 3977d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3978d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt res = get_bss_helper(args, error, __func__); 3979d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (!res) 3980d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return FALSE; 3981d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3982d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 3983d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt "a{sv}", &variant_iter)) 3984d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt goto nomem; 3985d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3986d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict)) 3987d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt goto nomem; 3988d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3989d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_WPS 3990d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt wps_ie = wpa_bss_get_vendor_ie_multi(res, WPS_IE_VENDOR_TYPE); 3991d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (wps_ie) { 3992d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (wps_is_selected_pbc_registrar(wps_ie)) 3993d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt type = "pbc"; 3994d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt else if (wps_is_selected_pin_registrar(wps_ie)) 3995d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt type = "pin"; 3996d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt } 3997d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_WPS */ 3998d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3999d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (!wpa_dbus_dict_append_string(&iter_dict, "Type", type)) 4000d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt goto nomem; 4001d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 4002d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict)) 4003d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt goto nomem; 4004d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (!dbus_message_iter_close_container(iter, &variant_iter)) 4005d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt goto nomem; 4006d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 4007d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return TRUE; 4008d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 4009d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtnomem: 4010d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 4011d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return FALSE; 4012d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt} 4013d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 4014d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 4015d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt/** 40168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ies - Return all IEs of a BSS 40171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 40181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 40191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 40201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 40218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 40228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "IEs" property. 40238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 40241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_ies(DBusMessageIter *iter, DBusError *error, 40251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 40268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 40271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 40281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 40298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 40311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 40321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 40338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE, 40351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res + 1, res->ie_len, 40361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 40378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 40388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 4041661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * wpas_dbus_getter_bss_age - Return time in seconds since BSS was last seen 4042661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 4043661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @error: Location to store error on failure 4044661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @user_data: Function specific data 4045661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Returns: TRUE on success, FALSE on failure 4046661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * 4047661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Getter for BSS age 4048661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt */ 4049661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_age(DBusMessageIter *iter, DBusError *error, 4050661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt void *user_data) 4051661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt{ 4052661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt struct bss_handler_args *args = user_data; 4053661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt struct wpa_bss *res; 4054661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt struct os_reltime now, diff = { 0, 0 }; 4055661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt u32 age; 4056661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 4057661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt res = get_bss_helper(args, error, __func__); 4058661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (!res) 4059661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt return FALSE; 4060661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 4061661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt os_get_reltime(&now); 4062661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt os_reltime_sub(&now, &res->last_update, &diff); 4063661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt age = diff.sec > 0 ? diff.sec : 0; 4064661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, &age, 4065661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt error); 4066661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt} 4067661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 4068661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 4069661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt/** 40708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_enabled - Check whether network is enabled or disabled 40711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 40721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 40731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 40741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 40758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 40768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "enabled" property of a configured network. 40778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 40781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_enabled(DBusMessageIter *iter, DBusError *error, 40791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 40808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 40811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct network_handler_args *net = user_data; 40828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t enabled = net->ssid->disabled ? FALSE : TRUE; 40831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 40841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 40851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &enabled, error); 40868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 40878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 40908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_enabled - Mark a configured network as enabled or disabled 40911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 40921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 40931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 40941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 40958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 40968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Enabled" property of a configured network. 40978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 40981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_enabled(DBusMessageIter *iter, DBusError *error, 40991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 41008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 41011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct network_handler_args *net = user_data; 41028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 41038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 41048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t enable; 41058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 41061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, 41071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &enable)) 41081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 41098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 41108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s = net->wpa_s; 41118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = net->ssid; 41128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 41138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (enable) 41148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_enable_network(wpa_s, ssid); 41158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 41168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_disable_network(wpa_s, ssid); 41178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 41181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 41198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 41208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 41218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 41228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 41238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_network_properties - Get options for a configured network 41241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 41251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 41261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 41271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 41288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 41298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Properties" property of a configured network. 41308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 41311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_network_properties(DBusMessageIter *iter, 41321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 41331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 41348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 41351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct network_handler_args *net = user_data; 41361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter, dict_iter; 41378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **iterator; 41388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **props = wpa_config_get_all(net->ssid, 1); 41391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 41408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 41411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!props) { 41421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 41431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 41448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 41458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 41461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, "a{sv}", 41471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &variant_iter) || 41488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !wpa_dbus_dict_open_write(&variant_iter, &dict_iter)) { 41491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 41508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 41518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 41528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 41538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator = props; 41548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*iterator) { 41558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string(&dict_iter, *iterator, 41568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *(iterator + 1))) { 41571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, 41581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "no memory"); 41598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 41608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 41618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator += 2; 41628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 41638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 41648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 41658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_close_write(&variant_iter, &dict_iter) || 41661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) { 41671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 41688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 41698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 41708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 41711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = TRUE; 41721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 41738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 41748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator = props; 41758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*iterator) { 41768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(*iterator); 41778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator++; 41788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 41798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(props); 41801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 41818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 41828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 41838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 41848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 41858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_network_properties - Set options for a configured network 41861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 41871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 41881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 41891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 41908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 41918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Properties" property of a configured network. 41928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 41931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_network_properties(DBusMessageIter *iter, 41941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 41951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 41968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 41971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct network_handler_args *net = user_data; 41988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid = net->ssid; 41991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter; 42008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 42011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_message_iter_recurse(iter, &variant_iter); 42021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return set_network_properties(net->wpa_s, ssid, &variant_iter, error); 42038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 420404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 420504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 420604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AP 420704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 420804949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_subscribe_preq( 420904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessage *message, struct wpa_supplicant *wpa_s) 421004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 421104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpas_dbus_priv *priv = wpa_s->global->dbus; 421204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *name; 421304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 421404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_s->preq_notify_peer != NULL) { 421504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strcmp(dbus_message_get_sender(message), 421604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->preq_notify_peer) == 0) 421704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 421804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 421904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return dbus_message_new_error(message, 422004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_DBUS_ERROR_SUBSCRIPTION_IN_USE, 422104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "Another application is already subscribed"); 422204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 422304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 422404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt name = os_strdup(dbus_message_get_sender(message)); 422504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!name) 422604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 422704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "out of memory"); 422804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 422904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->preq_notify_peer = name; 423004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 423104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* Subscribe to clean up if application closes socket */ 423204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpas_dbus_subscribe_noc(priv); 423304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 423404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* 423504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Double-check it's still alive to make sure that we didn't 423604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * miss the NameOwnerChanged signal, e.g. while strdup'ing. 423704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 423804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_bus_name_has_owner(priv->con, name, NULL)) { 423904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* 424004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Application no longer exists, clean up. 424104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * The return value is irrelevant now. 424204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 424304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Need to check if the NameOwnerChanged handling 424404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * already cleaned up because we have processed 424504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * DBus messages while checking if the name still 424604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * has an owner. 424704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 424804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpa_s->preq_notify_peer) 424904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 425004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(wpa_s->preq_notify_peer); 425104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->preq_notify_peer = NULL; 425204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpas_dbus_unsubscribe_noc(priv); 425304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 425404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 425504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 425604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 425704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 425804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 425904949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_unsubscribe_preq( 426004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessage *message, struct wpa_supplicant *wpa_s) 426104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 426204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpas_dbus_priv *priv = wpa_s->global->dbus; 426304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 426404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpa_s->preq_notify_peer) 426504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return dbus_message_new_error(message, 426604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_DBUS_ERROR_NO_SUBSCRIPTION, 426704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "Not subscribed"); 426804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 426904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strcmp(wpa_s->preq_notify_peer, 427004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_get_sender(message))) 427104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return dbus_message_new_error(message, 427204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_DBUS_ERROR_SUBSCRIPTION_EPERM, 427304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "Can't unsubscribe others"); 427404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 427504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(wpa_s->preq_notify_peer); 427604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->preq_notify_peer = NULL; 427704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpas_dbus_unsubscribe_noc(priv); 427804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 427904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 428004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 428104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 428204949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid wpas_dbus_signal_preq(struct wpa_supplicant *wpa_s, 428304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const u8 *addr, const u8 *dst, const u8 *bssid, 428404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const u8 *ie, size_t ie_len, u32 ssi_signal) 428504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 428604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessage *msg; 428704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessageIter iter, dict_iter; 428804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpas_dbus_priv *priv = wpa_s->global->dbus; 428904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 429004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* Do nothing if the control interface is not turned on */ 429104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (priv == NULL) 429204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return; 429304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 429404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_s->preq_notify_peer == NULL) 429504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return; 429604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 429704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt msg = dbus_message_new_signal(wpa_s->dbus_new_path, 429804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_DBUS_NEW_IFACE_INTERFACE, 429904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "ProbeRequest"); 430004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (msg == NULL) 430104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return; 430204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 430304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_set_destination(msg, wpa_s->preq_notify_peer); 430404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 430504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_iter_init_append(msg, &iter); 430604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 430704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpa_dbus_dict_open_write(&iter, &dict_iter)) 430804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto fail; 430904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (addr && !wpa_dbus_dict_append_byte_array(&dict_iter, "addr", 431004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt (const char *) addr, 431104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ETH_ALEN)) 431204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto fail; 431304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (dst && !wpa_dbus_dict_append_byte_array(&dict_iter, "dst", 431404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt (const char *) dst, 431504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ETH_ALEN)) 431604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto fail; 431704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (bssid && !wpa_dbus_dict_append_byte_array(&dict_iter, "bssid", 431804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt (const char *) bssid, 431904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ETH_ALEN)) 432004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto fail; 432104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (ie && ie_len && !wpa_dbus_dict_append_byte_array(&dict_iter, "ies", 432204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt (const char *) ie, 432304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ie_len)) 432404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto fail; 432504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (ssi_signal && !wpa_dbus_dict_append_int32(&dict_iter, "signal", 432604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ssi_signal)) 432704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto fail; 432804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpa_dbus_dict_close_write(&iter, &dict_iter)) 432904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto fail; 433004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 433104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_connection_send(priv->con, msg, NULL); 433204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto out; 433304949598a23f501be6eec21697465fd46a28840aDmitry Shmidtfail: 433404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "dbus: Failed to construct signal"); 433504949598a23f501be6eec21697465fd46a28840aDmitry Shmidtout: 433604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_unref(msg); 433704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 433804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 433904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AP */ 4340