dbus_new_handlers.c revision 2f023193a0fd630eb82ce6381b80911ad5a3462f
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" 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtextern int wpa_debug_level; 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtextern int wpa_debug_show_keys; 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtextern int wpa_debug_timestamp; 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *debug_strings[] = { 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "excessive", "msgdump", "debug", "info", "warning", "error", NULL 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_unknown_error - Return a new InvalidArgs error message 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @arg: Optional string appended to error message 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an UnknownError 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_error_unknown_error(DBusMessage *message, 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *arg) 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function can be called as a result of a failure 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * within internal getter calls, which will call this function 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * with a NULL message parameter. However, dbus_message_new_error 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * looks very unkindly (i.e, abort()) on a NULL message, so 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * in this case, we should not call it. 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (message == NULL) { 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_INFO, "dbus: wpas_dbus_error_unknown_error " 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "called with NULL message (arg=%s)", 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt arg ? arg : "N/A"); 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_UNKNOWN_ERROR, 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt arg); 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_iface_unknown - Return a new invalid interface error message 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus error message 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid interface error 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic DBusMessage * wpas_dbus_error_iface_unknown(DBusMessage *message) 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_IFACE_UNKNOWN, 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa_supplicant knows nothing about " 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "this interface."); 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_network_unknown - Return a new NetworkUnknown error message 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid network error 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic DBusMessage * wpas_dbus_error_network_unknown(DBusMessage *message) 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_NETWORK_UNKNOWN, 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "There is no such a network in this " 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "interface."); 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_invalid_args - Return a new InvalidArgs error message 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid options error 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_error_invalid_args(DBusMessage *message, 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *arg) 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply; 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, WPAS_DBUS_ERROR_INVALID_ARGS, 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Did not receive correct message " 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "arguments."); 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (arg != NULL) 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_append_args(reply, DBUS_TYPE_STRING, &arg, 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *dont_quote[] = { 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "key_mgmt", "proto", "pairwise", "auth_alg", "group", "eap", 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "opensc_engine_path", "pkcs11_engine_path", "pkcs11_module_path", 126d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt "bssid", "scan_freq", "freq_list", NULL 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic dbus_bool_t should_quote_opt(const char *key) 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i = 0; 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dont_quote[i] != NULL) { 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(key, dont_quote[i]) == 0) 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return FALSE; 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt i++; 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return TRUE; 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * get_iface_by_dbus_path - Get a new network interface 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: Pointer to global data from wpa_supplicant_init() 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @path: Pointer to a dbus object path representing an interface 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Pointer to the interface or %NULL if not found 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_supplicant * get_iface_by_dbus_path( 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global, const char *path) 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) { 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(wpa_s->dbus_new_path, path) == 0) 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_s; 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * set_network_properties - Set properties of a configured network 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @ssid: wpa_ssid structure for a configured network 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @iter: DBus message iterator containing dictionary of network 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * properties to set. 1651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: On failure, an error describing the failure 1661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request succeeds, FALSE if it failed 1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Sets network configuration with parameters given id DBus dictionary 1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t set_network_properties(struct wpa_supplicant *wpa_s, 1711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_ssid *ssid, 1721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter *iter, 1731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error) 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_dbus_dict_entry entry = { .type = DBUS_TYPE_STRING }; 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter_dict; 1771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char *value = NULL; 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpa_dbus_dict_open_read(iter, &iter_dict, error)) 1801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (wpa_dbus_dict_has_dict_entry(&iter_dict)) { 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t size = 50; 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 1851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpa_dbus_dict_get_entry(&iter_dict, &entry)) 1871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto error; 1881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt value = NULL; 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (entry.type == DBUS_TYPE_ARRAY && 1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.array_type == DBUS_TYPE_BYTE) { 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (entry.array_len <= 0) 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size = entry.array_len * 2 + 1; 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = wpa_snprintf_hex(value, size, 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (u8 *) entry.bytearray_value, 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.array_len); 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret <= 0) 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (entry.type == DBUS_TYPE_STRING) { 2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (should_quote_opt(entry.key)) { 2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size = os_strlen(entry.str_value); 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (size <= 0) 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size += 3; 2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(value, size, "\"%s\"", 2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.str_value); 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || (size_t) ret != (size - 1)) 2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_strdup(entry.str_value); 2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (entry.type == DBUS_TYPE_UINT32) { 2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(value, size, "%u", 2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.uint32_value); 2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret <= 0) 2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (entry.type == DBUS_TYPE_INT32) { 2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(value, size, "%d", 2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.int32_value); 2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret <= 0) 2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else 2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_set(ssid, entry.key, value, 0) < 0) 2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((os_strcmp(entry.key, "psk") == 0 && 2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value[0] == '"' && ssid->ssid_len) || 25104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt (os_strcmp(entry.key, "ssid") == 0 && ssid->passphrase)) 2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_update_psk(ssid); 2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (os_strcmp(entry.key, "priority") == 0) 2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_update_prio_list(wpa_s->conf); 2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 2611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidterror: 2631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(value); 2641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 2651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_INVALID_ARGS, 2661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "invalid message format"); 2671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_property_getter - Get basic type property 2731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Message iter to use when appending arguments 2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property (must be basic type) 2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @val: pointer to place holding property value 2761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: On failure an error describing the failure 2771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request was successful, FALSE if it failed 2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic getter for basic type properties. Type is required to be basic. 2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 2811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_property_getter(DBusMessageIter *iter, 2821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const int type, 2831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const void *val, 2841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error) 2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter; 2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_type_is_basic(type)) { 2891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 2901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: given type is not basic", __func__); 2911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 2951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_dbus_type_as_string(type), 2961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &variant_iter)) 2971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto error; 2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_append_basic(&variant_iter, type, val)) 3001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto error; 3011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_close_container(iter, &variant_iter)) 3031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto error; 3041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 3061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidterror: 3081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: error constructing reply", __func__); 3101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_property_setter - Set basic type property 3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property (must be basic type) 3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @val: pointer to place where value being set will be stored 3191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request was successful, FALSE if it failed 3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic setter for basic type properties. Type is required to be basic. 3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_property_setter(DBusMessageIter *iter, 3241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 3251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const int type, void *val) 3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter; 3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_type_is_basic(type)) { 3301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: given type is not basic", __func__); 3321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Look at the new value */ 3361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_message_iter_recurse(iter, &variant_iter); 3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&variant_iter) != type) { 3381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 3391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "wrong property type"); 3401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&variant_iter, val); 3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_array_property_getter - Get array type property 3501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iterator 3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property array elements (must be basic type) 3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @array: pointer to array of elements to put into response message 3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @array_len: length of above array 3541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: a pointer to an error to fill on failure 3551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request succeeded, FALSE if it failed 3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic getter for array type properties. Array elements type is 3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * required to be basic. 3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_array_property_getter(DBusMessageIter *iter, 3611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const int type, 3621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const void *array, 3631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt size_t array_len, 3641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error) 3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter, array_iter; 3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char type_str[] = "a?"; /* ? will be replaced with subtype letter; */ 3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *sub_type_str; 3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t element_size, i; 3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_type_is_basic(type)) { 3721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: given type is not basic", __func__); 3741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sub_type_str = wpa_dbus_type_as_string(type); 3788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt type_str[1] = sub_type_str[0]; 3798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 3811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt type_str, &variant_iter)) { 3821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: failed to construct message 1", __func__); 3841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY, 3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sub_type_str, &array_iter)) { 3891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: failed to construct message 2", __func__); 3911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch(type) { 3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_BYTE: 3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_BOOLEAN: 3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = 1; 3988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_INT16: 4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_UINT16: 4018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(uint16_t); 4028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_INT32: 4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_UINT32: 4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(uint32_t); 4068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_INT64: 4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_UINT64: 4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(uint64_t); 4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_DOUBLE: 4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(double); 4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_STRING: 4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_OBJECT_PATH: 4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(char *); 4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 4191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 4201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: unknown element type %d", __func__, type); 4211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < array_len; i++) { 4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_append_basic(&array_iter, type, 4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt array + i * element_size); 4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_close_container(&variant_iter, &array_iter)) { 4301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 4311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: failed to construct message 3", __func__); 4321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_close_container(iter, &variant_iter)) { 4361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 4371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: failed to construct message 4", __func__); 4381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 4391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 4401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 4411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 44604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_simple_array_array_property_getter - Get array array type property 44704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iterator 44804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @type: DBus type of property array elements (must be basic type) 44904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @array: pointer to array of elements to put into response message 45004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @array_len: length of above array 45104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: a pointer to an error to fill on failure 45204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE if the request succeeded, FALSE if it failed 45304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 45404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Generic getter for array type properties. Array elements type is 45504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * required to be basic. 45604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 45704949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_simple_array_array_property_getter(DBusMessageIter *iter, 45804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const int type, 45904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpabuf **array, 46004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt size_t array_len, 46104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusError *error) 46204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 46304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessageIter variant_iter, array_iter; 46404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char type_str[] = "aa?"; 46504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char inner_type_str[] = "a?"; 46604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const char *sub_type_str; 46704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt size_t i; 46804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 46904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_type_is_basic(type)) { 47004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 47104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "%s: given type is not basic", __func__); 47204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 47304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 47404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 47504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt sub_type_str = wpa_dbus_type_as_string(type); 47604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt type_str[2] = sub_type_str[0]; 47704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt inner_type_str[1] = sub_type_str[0]; 47804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 47904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 48004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt type_str, &variant_iter)) { 48104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 48204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "%s: failed to construct message 1", __func__); 48304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 48404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 48504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY, 48604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt inner_type_str, &array_iter)) { 48704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 48804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "%s: failed to construct message 2", __func__); 48904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 49004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 49104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 49204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt for (i = 0; i < array_len; i++) { 49304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_dbus_dict_bin_array_add_element(&array_iter, 49404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpabuf_head(array[i]), 49504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpabuf_len(array[i])); 49604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 49704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 49804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 49904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_message_iter_close_container(&variant_iter, &array_iter)) { 50004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 50104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "%s: failed to close message 2", __func__); 50204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 50304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 50404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 50504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_message_iter_close_container(iter, &variant_iter)) { 50604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 50704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "%s: failed to close message 1", __func__); 50804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 50904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 51004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 51104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return TRUE; 51204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 51304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 51404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 51504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 5168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_create_interface - Request registration of a network iface 5178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 5188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure 5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the new interface object, 5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or a dbus error message with more information 5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "CreateInterface" method call. Handles requests 5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to register a network interface that wpa_supplicant 5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * will manage. 5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_create_interface(DBusMessage *message, 5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter_dict; 5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter; 5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_dbus_dict_entry entry; 5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *driver = NULL; 5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *ifname = NULL; 5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *confname = NULL; 5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *bridge_ifname = NULL; 5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpa_dbus_dict_open_read(&iter, &iter_dict, NULL)) 5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (wpa_dbus_dict_has_dict_entry(&iter_dict)) { 5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_get_entry(&iter_dict, &entry)) 5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 54504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!os_strcmp(entry.key, "Driver") && 5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (entry.type == DBUS_TYPE_STRING)) { 5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt driver = os_strdup(entry.str_value); 5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (driver == NULL) 5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 55104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (!os_strcmp(entry.key, "Ifname") && 5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (entry.type == DBUS_TYPE_STRING)) { 5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ifname = os_strdup(entry.str_value); 5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ifname == NULL) 5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 55704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (!os_strcmp(entry.key, "ConfigFile") && 5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (entry.type == DBUS_TYPE_STRING)) { 5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt confname = os_strdup(entry.str_value); 5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (confname == NULL) 5628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 56304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (!os_strcmp(entry.key, "BridgeIfname") && 5648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (entry.type == DBUS_TYPE_STRING)) { 5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bridge_ifname = os_strdup(entry.str_value); 5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bridge_ifname == NULL) 5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ifname == NULL) 5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; /* Required Ifname argument missing */ 5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Try to get the wpa_supplicant record for this iface, return 5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * an error if we already control it. 5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_get_iface(global, ifname) != NULL) { 5838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, 5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPAS_DBUS_ERROR_IFACE_EXISTS, 5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa_supplicant already " 5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "controls this interface."); 5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_interface iface; 5908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&iface, 0, sizeof(iface)); 5918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.driver = driver; 5928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.ifname = ifname; 5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.confname = confname; 5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.bridge_ifname = bridge_ifname; 5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Otherwise, have wpa_supplicant attach to it. */ 5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((wpa_s = wpa_supplicant_add_iface(global, &iface))) { 5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *path = wpa_s->dbus_new_path; 5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, 6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &path, DBUS_TYPE_INVALID); 6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_unknown_error( 6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "wpa_supplicant couldn't grab this " 6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "interface."); 6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 6098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(driver); 6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ifname); 61161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_free(confname); 6128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bridge_ifname); 6138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 6148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterror: 6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, NULL); 6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 6188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_interface - Request deregistration of an interface 6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: wpa_supplicant global data structure 6258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing a UINT32 indicating success (1) or 6268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * failure (0), or returns a dbus error message with more information 6278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 6288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "removeInterface" method call. Handles requests 6298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to deregister a network interface that wpa_supplicant 6308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * currently manages. 6318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 6328d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_interface(DBusMessage *message, 6338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 6348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *path; 6378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &path, 6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s = get_iface_by_dbus_path(global, path); 6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s == NULL) 6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_iface_unknown(message); 645c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt else if (wpa_supplicant_remove_iface(global, wpa_s, 0)) { 6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_unknown_error( 6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "wpa_supplicant couldn't remove this " 6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "interface."); 6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_interface - Get the object path for an interface name 6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure 6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the interface object, 6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or a dbus error message with more information 6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "getInterface" method call. 6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_interface(DBusMessage *message, 6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *ifname; 6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *path; 6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &ifname, 6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s = wpa_supplicant_get_iface(global, ifname); 6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s == NULL) 6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_error_iface_unknown(message); 6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt path = wpa_s->dbus_new_path; 6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply == NULL) 6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path, 6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID)) { 6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 6888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_level - Get debug level 6971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 6981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 6991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 7001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugLevel" property. 7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_level(DBusMessageIter *iter, 7051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 7061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 7078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *str; 7098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int idx = wpa_debug_level; 7101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 7118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (idx < 0) 7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt idx = 0; 7138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (idx > 5) 7148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt idx = 5; 7158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt str = debug_strings[idx]; 7161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 7171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &str, error); 7188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_timestamp - Get debug timestamp 7231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 7241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 7251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 7261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 7278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugTimestamp" property. 7298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_timestamp(DBusMessageIter *iter, 7311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 7321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 7338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 7351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &wpa_debug_timestamp, error); 7368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_show_keys - Get debug show keys 7421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 7431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 7441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 7451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 7468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugShowKeys" property. 7488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_show_keys(DBusMessageIter *iter, 7501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 7511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 7528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 7541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &wpa_debug_show_keys, error); 7558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_level - Set debug level 7601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 7611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 7621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 7631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 7648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugLevel" property. 7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_level(DBusMessageIter *iter, 7681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 7698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_global *global = user_data; 7718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *str = NULL; 7728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i, val = -1; 7738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING, 7751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &str)) 7761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 7778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; debug_strings[i]; i++) 7798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(debug_strings[i], str) == 0) { 7808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val = i; 7818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 7828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (val < 0 || 7858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_set_debug_params(global, val, wpa_debug_timestamp, 7868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_show_keys)) { 7871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, "wrong debug " 7881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "level value"); 7891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 7908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 7938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_timestamp - Set debug timestamp 7981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 7991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 8001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 8011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 8028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 8038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugTimestamp" property. 8048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 8051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_timestamp(DBusMessageIter *iter, 8061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 8071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 8088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_global *global = user_data; 8108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t val; 8118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, 8131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &val)) 8141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 8158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_set_debug_params(global, wpa_debug_level, val ? 1 : 0, 8178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_show_keys); 8181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 8198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 8238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_show_keys - Set debug show keys 8241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 8251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 8261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 8271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 8288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 8298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugShowKeys" property. 8308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 8311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_show_keys(DBusMessageIter *iter, 8321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 8331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 8348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_global *global = user_data; 8368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t val; 8378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, 8391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &val)) 8401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 8418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_set_debug_params(global, wpa_debug_level, 8438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_timestamp, 8448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val ? 1 : 0); 8451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 8468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 8508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_interfaces - Request registered interfaces list 8511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 8521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 8531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 8541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 8558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 8568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Interfaces" property. Handles requests 8578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of registered interfaces objects 8588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * paths 8598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 8601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_interfaces(DBusMessageIter *iter, 8611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 8621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 8638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_global *global = user_data; 8658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 8668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char **paths; 8678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int i = 0, num = 0; 8681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success; 8698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) 8718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt num++; 8728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 87361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt paths = os_calloc(num, sizeof(char *)); 8748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!paths) { 8751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 8761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 8778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) 8808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt paths[i++] = wpa_s->dbus_new_path; 8818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, 8831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_OBJECT_PATH, 8841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt paths, num, error); 8858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths); 8871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 8888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 8928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_eap_methods - Request supported EAP methods list 8931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 8941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 8951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 8961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 8978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 8988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "EapMethods" property. Handles requests 8998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of strings with supported EAP methods 9008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 9011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_eap_methods(DBusMessageIter *iter, 9021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 9038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **eap_methods; 9058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t num_items = 0; 9061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success; 9078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eap_methods = eap_get_names_as_string_array(&num_items); 9098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!eap_methods) { 9101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 9111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 9128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, 9151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_STRING, 9161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt eap_methods, 9171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt num_items, error); 9188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (num_items) 9208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(eap_methods[--num_items]); 9218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(eap_methods); 9221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 9238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 926d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt/** 927d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * wpas_dbus_getter_global_capabilities - Request supported global capabilities 928d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @iter: Pointer to incoming dbus message iter 929d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @error: Location to store error on failure 930d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @user_data: Function specific data 931d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Returns: TRUE on success, FALSE on failure 932d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * 933d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Getter for "Capabilities" property. Handles requests by dbus clients to 934d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * return a list of strings with supported capabilities like AP, RSN IBSS, 935d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * and P2P that are determined at compile time. 936d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt */ 937d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtdbus_bool_t wpas_dbus_getter_global_capabilities(DBusMessageIter *iter, 938d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt DBusError *error, 939d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt void *user_data) 940d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{ 941d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt const char *capabilities[5] = { NULL, NULL, NULL, NULL, NULL }; 942d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt size_t num_items = 0; 943d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 944d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_AP 945d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities[num_items++] = "ap"; 946d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_AP */ 947d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_IBSS_RSN 948d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities[num_items++] = "ibss-rsn"; 949d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_IBSS_RSN */ 950d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_P2P 951d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities[num_items++] = "p2p"; 952d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_P2P */ 953d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_INTERWORKING 954d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities[num_items++] = "interworking"; 955d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_INTERWORKING */ 956d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 957d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return wpas_dbus_simple_array_property_getter(iter, 958d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt DBUS_TYPE_STRING, 959d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities, 960d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt num_items, error); 961d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt} 962d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 963d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 9648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_type(DBusMessage *message, DBusMessageIter *var, 9658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **type, DBusMessage **reply) 9668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_STRING) { 9688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 9698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Type must be a string"); 9708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 9718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong Type value type. String required"); 9728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(var, type); 9758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 9768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ssids(DBusMessage *message, DBusMessageIter *var, 9808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params *params, 9818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage **reply) 9828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_ssid *ssids = params->ssids; 9848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t ssids_num = 0; 9858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *ssid; 9868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter array_iter, sub_array_iter; 9878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *val; 9888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int len; 9898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) { 9918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: ssids " 9928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "must be an array of arrays of bytes"); 9938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 9948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong SSIDs value type. Array of arrays of " 9958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "bytes required"); 9968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(var, &array_iter); 10008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY || 10028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE) 10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 10048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: ssids " 10058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "must be an array of arrays of bytes"); 10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong SSIDs value type. Array of arrays of " 10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "bytes required"); 10098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY) 10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssids_num >= WPAS_MAX_SCAN_SSIDS) { 10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Too many ssids specified on scan dbus " 10178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "call"); 10188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Too many ssids specified. Specify " 10208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "at most four"); 10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&array_iter, &sub_array_iter); 10258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len); 10278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1028c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt if (len > MAX_SSID_LEN) { 1029c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt wpa_printf(MSG_DEBUG, 1030c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt "wpas_dbus_handler_scan[dbus]: " 1031c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt "SSID too long (len=%d max_len=%d)", 1032c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt len, MAX_SSID_LEN); 1033c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 1034c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt message, "Invalid SSID: too long"); 1035c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return -1; 1036c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt } 1037c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 10388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (len != 0) { 10398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = os_malloc(len); 10408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 10418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, 10428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpas_dbus_handler_scan[dbus]: " 10438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "out of memory. Cannot allocate " 10448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "memory for SSID"); 10458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = dbus_message_new_error( 10468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, DBUS_ERROR_NO_MEMORY, NULL); 10478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(ssid, val, len); 10508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 10518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Allow zero-length SSIDs */ 10528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = NULL; 10538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssids[ssids_num].ssid = ssid; 10568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssids[ssids_num].ssid_len = len; 10578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 10598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssids_num++; 10608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->num_ssids = ssids_num; 10638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 10648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ies(DBusMessage *message, DBusMessageIter *var, 10688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params *params, 10698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage **reply) 10708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *ies = NULL, *nies; 10728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ies_len = 0; 10738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter array_iter, sub_array_iter; 10748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *val; 10758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int len; 10768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) { 10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: ies must " 10798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "be an array of arrays of bytes"); 10808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong IEs value type. Array of arrays of " 10828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "bytes required"); 10838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(var, &array_iter); 10878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY || 10898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE) 10908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 10918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: ies must " 10928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "be an array of arrays of bytes"); 10938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong IEs value type. Array required"); 10958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY) 10998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 11008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&array_iter, &sub_array_iter); 11018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len); 11038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (len == 0) { 11048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 11058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 11068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nies = os_realloc(ies, ies_len + len); 11098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nies == NULL) { 11108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 11118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "out of memory. Cannot allocate memory for " 11128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "IE"); 11138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ies); 11148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = dbus_message_new_error( 11158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, DBUS_ERROR_NO_MEMORY, NULL); 11168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ies = nies; 11198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(ies + ies_len, val, len); 11208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ies_len += len; 11218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 11238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->extra_ies = ies; 11268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->extra_ies_len = ies_len; 11278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 11288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 11298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_channels(DBusMessage *message, 11328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter *var, 11338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params *params, 11348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage **reply) 11358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 11368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter array_iter, sub_array_iter; 11378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int *freqs = NULL, *nfreqs; 11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int freqs_num = 0; 11398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) { 11418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 11428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Channels must be an array of structs"); 11438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong Channels value type. Array of structs " 11458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "required"); 11468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(var, &array_iter); 11508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_STRUCT) { 11528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, 11538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpas_dbus_handler_scan[dbus]: Channels must be an " 11548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "array of structs"); 11558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong Channels value type. Array of structs " 11578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "required"); 11588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_STRUCT) 11628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 11638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int freq, width; 11648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&array_iter, &sub_array_iter); 11668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&sub_array_iter) != 11688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_UINT32) { 11698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 11708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Channel must by specified by struct of " 11718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "two UINT32s %c", 11728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_arg_type( 11738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &sub_array_iter)); 11748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong Channel struct. Two UINT32s " 11768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "required"); 11778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 11788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&sub_array_iter, &freq); 11818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_next(&sub_array_iter) || 11838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_arg_type(&sub_array_iter) != 11848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_UINT32) { 11858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 11868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Channel must by specified by struct of " 11878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "two UINT32s"); 11888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, 11908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Wrong Channel struct. Two UINT32s required"); 11918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 11928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&sub_array_iter, &width); 11968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define FREQS_ALLOC_CHUNK 32 11988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (freqs_num % FREQS_ALLOC_CHUNK == 0) { 119961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt nfreqs = os_realloc_array( 120061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt freqs, freqs_num + FREQS_ALLOC_CHUNK, 120161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt sizeof(int)); 12028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nfreqs == NULL) 12038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 12048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs = nfreqs; 12058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (freqs == NULL) { 12078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 12088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "out of memory. can't allocate memory for " 12098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "freqs"); 12108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = dbus_message_new_error( 12118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, DBUS_ERROR_NO_MEMORY, NULL); 12128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs[freqs_num] = freq; 12168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs_num++; 12188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 12198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 122161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt nfreqs = os_realloc_array(freqs, freqs_num + 1, sizeof(int)); 12228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nfreqs == NULL) 12238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 12248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs = nfreqs; 12258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (freqs == NULL) { 12268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 12278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "out of memory. Can't allocate memory for freqs"); 12288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = dbus_message_new_error( 12298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, DBUS_ERROR_NO_MEMORY, NULL); 12308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs[freqs_num] = 0; 12338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->freqs = freqs; 12358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 12368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 12378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 12408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_scan - Request a wireless scan on an interface 12418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 12428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 12438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL indicating success or DBus error message on failure 12448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 12458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Scan" method call of a network device. Requests 12468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * that wpa_supplicant perform a wireless scan as soon as possible 12478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * on a particular wireless interface. 12488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 12498d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_scan(DBusMessage *message, 12508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 12518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 12528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 12538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, dict_iter, entry_iter, variant_iter; 12548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *key = NULL, *type = NULL; 12558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params params; 12568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t i; 12578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(¶ms, 0, sizeof(params)); 12598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 12618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&iter, &dict_iter); 12638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dbus_message_iter_get_arg_type(&dict_iter) == 12658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_DICT_ENTRY) { 12668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&dict_iter, &entry_iter); 12678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&entry_iter, &key); 12688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&entry_iter); 12698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&entry_iter, &variant_iter); 12708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(key, "Type") == 0) { 12728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_type(message, &variant_iter, 12738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &type, &reply) < 0) 12748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 12758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(key, "SSIDs") == 0) { 12768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_ssids(message, &variant_iter, 12778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ¶ms, &reply) < 0) 12788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 12798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(key, "IEs") == 0) { 12808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_ies(message, &variant_iter, 12818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ¶ms, &reply) < 0) 12828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 12838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(key, "Channels") == 0) { 12848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_channels(message, &variant_iter, 12858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ¶ms, &reply) < 0) 12868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 12878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 12888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 12898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Unknown argument %s", key); 12908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, key); 12918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 12928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&dict_iter); 12958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!type) { 12988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 12998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Scan type not specified"); 13008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, key); 13018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!os_strcmp(type, "passive")) { 13058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (params.num_ssids || params.extra_ies_len) { 13068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 13078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "SSIDs or IEs specified for passive scan."); 13088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args( 13098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "You can specify only Channels in " 13108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "passive scan"); 13118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (params.freqs && params.freqs[0]) { 13138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_trigger_scan(wpa_s, ¶ms); 13148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 1315d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt wpa_s->scan_req = MANUAL_SCAN_REQ; 13168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_req_scan(wpa_s, 0, 0); 13178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (!os_strcmp(type, "active")) { 13198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!params.num_ssids) { 13208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Add wildcard ssid */ 13218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.num_ssids++; 13228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 132304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN 132404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt autoscan_deinit(wpa_s); 132504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */ 13268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_trigger_scan(wpa_s, ¶ms); 13278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 13288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 13298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Unknown scan type: %s", type); 13308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, 13318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Wrong scan type"); 13328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 13368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < WPAS_MAX_SCAN_SSIDS; i++) 13378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free((u8 *) params.ssids[i].ssid); 13388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free((u8 *) params.extra_ies); 13398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(params.freqs); 13408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 13418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 13428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 13458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_disconnect - Terminate the current connection 13468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 13478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 13488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NotConnected DBus error message if already not connected 13498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or NULL otherwise. 13508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 13518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Disconnect" method call of network interface. 13528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 13538d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_disconnect(DBusMessage *message, 13548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 13558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 13568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->current_ssid != NULL) { 13578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->disconnected = 1; 13588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_deauthenticate(wpa_s, 13598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WLAN_REASON_DEAUTH_LEAVING); 13608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 13628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_NOT_CONNECTED, 13658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "This interface is not connected"); 13668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 13678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 13708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_add_network - Add a new configured network 13718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 13728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 13738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing the object path of the new network 13748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 13758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "AddNetwork" method call of a network interface. 13768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 13778d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_network(DBusMessage *message, 13788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 13798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 13808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 13818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter; 13828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid = NULL; 13838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *path = path_buf; 13841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError error; 13858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 13878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = wpa_config_add_network(wpa_s->conf); 13898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 13908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "wpas_dbus_handler_add_network[dbus]: " 13918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "can't add new interface."); 13928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_unknown_error( 13938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, 13948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa_supplicant could not add " 13958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "a network on this interface."); 13968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 13978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_added(wpa_s, ssid); 13998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid->disabled = 1; 14008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_set_network_defaults(ssid); 14018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_error_init(&error); 14031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!set_network_properties(wpa_s, ssid, &iter, &error)) { 14048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_add_network[dbus]:" 14058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "control interface couldn't set network " 14068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "properties"); 14071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_reply_new_from_error(message, &error, 14081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_ERROR_INVALID_ARGS, 14091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "Failed to add network"); 14101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_error_free(&error); 14118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 14128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Construct the object path for this network. */ 14158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX, 14168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d", 14178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, ssid->id); 14188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 14208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply == NULL) { 14218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 14228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 14238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 14248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path, 14268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID)) { 14278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 14288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 14298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 14308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 14318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 14348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr: 14368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid) { 14378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_removed(wpa_s, ssid); 14388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_remove_network(wpa_s->conf, ssid->id); 14398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 14418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 14428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 144561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * wpas_dbus_handler_reassociate - Reassociate to current AP 144661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * @message: Pointer to incoming dbus message 144761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 144861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * Returns: NotConnected DBus error message if not connected 144961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * or NULL otherwise. 145061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * 145161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * Handler function for "Reassociate" method call of network interface. 145261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt */ 145361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtDBusMessage * wpas_dbus_handler_reassociate(DBusMessage *message, 145461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt struct wpa_supplicant *wpa_s) 145561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 145661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (wpa_s->current_ssid != NULL) { 1457d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt wpas_request_connection(wpa_s); 145861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return NULL; 145961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 146061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 146161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_NOT_CONNECTED, 146261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "This interface is not connected"); 146361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 146461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 146561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 146661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt/** 14678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_network - Remove a configured network 14688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 14698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 14708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure 14718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 14728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveNetwork" method call of a network interface. 14738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 14748d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_network(DBusMessage *message, 14758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 14768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 14778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 14788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *op; 14798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *iface = NULL, *net_id = NULL; 14808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int id; 14818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 14822f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt int was_disabled; 14838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op, 14858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 14868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Extract the network ID and ensure the network */ 14888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* is actually a child of this interface */ 148975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen iface = wpas_dbus_new_decompose_object_path(op, 0, &net_id, NULL); 1490d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (iface == NULL || net_id == NULL || 1491d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt os_strcmp(iface, wpa_s->dbus_new_path) != 0) { 14928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 14938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 14948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1496d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt errno = 0; 14978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt id = strtoul(net_id, NULL, 10); 1498d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (errno != 0) { 14998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 15008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 15018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 15048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 15058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_network_unknown(message); 15068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 15078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15092f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt was_disabled = ssid->disabled; 15102f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 15118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_removed(wpa_s, ssid); 15128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_remove_network(wpa_s->conf, id) < 0) { 15148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, 15158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpas_dbus_handler_remove_network[dbus]: " 15168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "error occurred when removing network %d", id); 15178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_unknown_error( 15188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "error removing the specified network on " 15198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "this interface."); 15208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 15218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == wpa_s->current_ssid) 15248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_deauthenticate(wpa_s, 15258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WLAN_REASON_DEAUTH_LEAVING); 15262f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt else if (!was_disabled && wpa_s->sched_scanning) { 15272f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt wpa_printf(MSG_DEBUG, "Stop ongoing sched_scan to remove " 15282f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt "network from filters"); 15292f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt wpa_supplicant_cancel_sched_scan(wpa_s); 15302f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt wpa_supplicant_req_scan(wpa_s, 0, 0); 15312f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt } 15322f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 15338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 15358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(iface); 15368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(net_id); 15378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 15388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 15398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void remove_network(void *arg, struct wpa_ssid *ssid) 15428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 15438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = arg; 15448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_removed(wpa_s, ssid); 15468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_remove_network(wpa_s->conf, ssid->id) < 0) { 15488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, 15498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpas_dbus_handler_remove_all_networks[dbus]: " 15508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "error occurred when removing network %d", 15518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid->id); 15528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 15538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == wpa_s->current_ssid) 1556d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt wpa_supplicant_deauthenticate(wpa_s, 1557d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt WLAN_REASON_DEAUTH_LEAVING); 15588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 15598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 15628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_all_networks - Remove all configured networks 15638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 15648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 15658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure 15668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 15678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveAllNetworks" method call of a network interface. 15688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 15698d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_all_networks( 15708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *message, struct wpa_supplicant *wpa_s) 15718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 15722f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt if (wpa_s->sched_scanning) 15732f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt wpa_supplicant_cancel_sched_scan(wpa_s); 15742f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 15758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* NB: could check for failure and return an error */ 15768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_foreach_network(wpa_s->conf, remove_network, wpa_s); 15778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 15788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 15798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 15828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_select_network - Attempt association with a network 15838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 15848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 15858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure 15868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 15878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "SelectNetwork" method call of network interface. 15888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 15898d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_select_network(DBusMessage *message, 15908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 15918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 15928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 15938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *op; 15948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *iface = NULL, *net_id = NULL; 15958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int id; 15968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 15978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op, 15998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 16008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Extract the network ID and ensure the network */ 16028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* is actually a child of this interface */ 160375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen iface = wpas_dbus_new_decompose_object_path(op, 0, &net_id, NULL); 1604d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (iface == NULL || net_id == NULL || 1605d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt os_strcmp(iface, wpa_s->dbus_new_path) != 0) { 16068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 16078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 16088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1610d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt errno = 0; 16118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt id = strtoul(net_id, NULL, 10); 1612d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (errno != 0) { 16138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 16148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 16158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 16188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 16198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_network_unknown(message); 16208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 16218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Finally, associate with the network */ 16248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_select_network(wpa_s, ssid); 16258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 16278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(iface); 16288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(net_id); 16298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 16308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 16318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 16341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * wpas_dbus_handler_network_reply - Reply to a NetworkRequest signal 16351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @message: Pointer to incoming dbus message 16361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 16371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: NULL on success or dbus error on failure 16381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * 16391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Handler function for "NetworkReply" method call of network interface. 16401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt */ 16411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry ShmidtDBusMessage * wpas_dbus_handler_network_reply(DBusMessage *message, 16421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s) 16431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 16441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef IEEE8021X_EAPOL 16451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessage *reply = NULL; 16461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const char *op, *field, *value; 16471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char *iface = NULL, *net_id = NULL; 16481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int id; 16491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_ssid *ssid; 16501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 16511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_get_args(message, NULL, 16521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_OBJECT_PATH, &op, 16531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_STRING, &field, 16541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_STRING, &value, 16551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_INVALID)) 16561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_error_invalid_args(message, NULL); 16571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 16581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Extract the network ID and ensure the network */ 16591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* is actually a child of this interface */ 16601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt iface = wpas_dbus_new_decompose_object_path(op, 0, &net_id, NULL); 1661d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (iface == NULL || net_id == NULL || 1662d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt os_strcmp(iface, wpa_s->dbus_new_path) != 0) { 16631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 16641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto out; 16651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 16661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1667d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt errno = 0; 16681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt id = strtoul(net_id, NULL, 10); 1669d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (errno != 0) { 16701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_error_invalid_args(message, net_id); 16711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto out; 16721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 16731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 16741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 16751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (ssid == NULL) { 16761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_error_network_unknown(message); 16771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto out; 16781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 16791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 16801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (wpa_supplicant_ctrl_iface_ctrl_rsp_handle(wpa_s, ssid, 16811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt field, value) < 0) 16821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_error_invalid_args(message, field); 16831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt else { 16841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Tell EAP to retry immediately */ 16851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt eapol_sm_notify_ctrl_response(wpa_s->eapol); 16861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 16871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 16881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtout: 16891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(iface); 16901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(net_id); 16911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return reply; 16921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#else /* IEEE8021X_EAPOL */ 16931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: 802.1X not included"); 16941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_error_unknown_error(message, "802.1X not included"); 16951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* IEEE8021X_EAPOL */ 16961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 16971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 16981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 16991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/** 17008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_add_blob - Store named binary blob (ie, for certificates) 17018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 17028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 17038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing an error on failure or NULL on success 17048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 17058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally store a binary blobs. 17068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 17078d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_blob(DBusMessage *message, 17088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 17098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 17118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, array_iter; 17128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *blob_name; 17148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *blob_data; 17158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int blob_len; 17168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_config_blob *blob = NULL; 17178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 17198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&iter, &blob_name); 17208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_get_blob(wpa_s->conf, blob_name)) { 17228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, 17238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPAS_DBUS_ERROR_BLOB_EXISTS, 17248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 17258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&iter); 17288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&iter, &array_iter); 17298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_fixed_array(&array_iter, &blob_data, &blob_len); 17318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = os_zalloc(sizeof(*blob)); 17338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!blob) { 17348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 17358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 17368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 17378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->data = os_malloc(blob_len); 17408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!blob->data) { 17418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 17428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 17438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 17448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(blob->data, blob_data, blob_len); 17468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->len = blob_len; 17488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->name = os_strdup(blob_name); 17498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!blob->name) { 17508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 17518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 17528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 17538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_set_blob(wpa_s->conf, blob); 17568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_blob_added(wpa_s, blob->name); 17578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 17598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr: 17618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (blob) { 17628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(blob->name); 17638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(blob->data); 17648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(blob); 17658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 17678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 17718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_blob - Get named binary blob (ie, for certificates) 17728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 17738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 17748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing array of bytes (blob) 17758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 17768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Gets one wpa_supplicant's binary blobs. 17778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 17788d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_blob(DBusMessage *message, 17798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 17808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 17828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, array_iter; 17838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *blob_name; 17858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct wpa_config_blob *blob; 17868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name, 17888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 17898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = wpa_config_get_blob(wpa_s->conf, blob_name); 17918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!blob) { 17928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, 17938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPAS_DBUS_ERROR_BLOB_UNKNOWN, 17948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Blob id not set"); 17958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 17988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!reply) { 17998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 18008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 18018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 18028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init_append(reply, &iter); 18058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, 18078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_BYTE_AS_STRING, 18088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &array_iter)) { 18098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 18108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 18118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 18128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 18138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_append_fixed_array(&array_iter, DBUS_TYPE_BYTE, 18168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &(blob->data), blob->len)) { 18178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 18188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 18198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 18208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 18218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_close_container(&iter, &array_iter)) { 18248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 18258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 18268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 18278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 18288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 18318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 18328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 18338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 18368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_remove_handler_remove_blob - Remove named binary blob 18378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 18388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 18398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error 18408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 18418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally remove a binary blobs. 18428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 18438d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_blob(DBusMessage *message, 18448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 18458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 18478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *blob_name; 18488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name, 18508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 18518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_remove_blob(wpa_s->conf, blob_name)) { 18538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, 18548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPAS_DBUS_ERROR_BLOB_UNKNOWN, 18558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Blob id not set"); 18568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_blob_removed(wpa_s, blob_name); 18588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 18608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 18628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 18648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_flush_bss - Flush the BSS cache 18658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 18668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 18678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL 18688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 18698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "FlushBSS" method call of network interface. 18708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 18718d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_flush_bss(DBusMessage *message, 18728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 18738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t age; 18758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_UINT32, &age, 18778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 18788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (age == 0) 18808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_bss_flush(wpa_s); 18818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 18828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_bss_flush_by_age(wpa_s, age); 18838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 18858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 18868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 188804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN 188904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 189004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_handler_autoscan - Set autoscan parameters for the interface 189104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @message: Pointer to incoming dbus message 189204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 189304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: NULL 189404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 189504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Handler function for "AutoScan" method call of network interface. 189604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 189704949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_autoscan(DBusMessage *message, 189804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_supplicant *wpa_s) 189904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 190004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessage *reply = NULL; 190104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt enum wpa_states state = wpa_s->wpa_state; 190204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *arg; 190304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 190404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &arg, 190504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBUS_TYPE_INVALID); 190604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 190704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (arg != NULL && os_strlen(arg) > 0) { 190804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *tmp; 190904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt tmp = os_strdup(arg); 191004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (tmp == NULL) { 191104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt reply = dbus_message_new_error(message, 191204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBUS_ERROR_NO_MEMORY, 191304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt NULL); 191404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else { 191504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(wpa_s->conf->autoscan); 191604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->conf->autoscan = tmp; 191704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (state == WPA_DISCONNECTED || state == WPA_INACTIVE) 191804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt autoscan_init(wpa_s, 1); 191904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt else if (state == WPA_SCANNING) 192004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_supplicant_reinit_autoscan(wpa_s); 192104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 192204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (arg != NULL && os_strlen(arg) == 0) { 192304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(wpa_s->conf->autoscan); 192404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->conf->autoscan = NULL; 192504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt autoscan_deinit(wpa_s); 192604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else 192704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt reply = dbus_message_new_error(message, 192804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBUS_ERROR_INVALID_ARGS, 192904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt NULL); 193004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 193104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return reply; 193204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 193304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */ 193404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 193504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 19368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 19378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_capabilities - Return interface capabilities 19381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 19391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 19401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 19411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 19428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 19438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Capabilities" property of an interface. 19448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 19451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_capabilities(DBusMessageIter *iter, 19461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 19478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 19481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 19498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_capa capa; 19508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 19511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter iter_dict, iter_dict_entry, iter_dict_val, iter_array, 19528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt variant_iter; 19538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *scans[] = { "active", "passive", "ssid" }; 19548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 19568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "a{sv}", &variant_iter)) 19578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict)) 19608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = wpa_drv_get_capa(wpa_s, &capa); 19638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** pairwise cipher */ 19658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 19668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = {"ccmp", "tkip", "none"}; 19678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 19688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "Pairwise", args, 19698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(args) / sizeof(char*))) 19708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 19728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Pairwise", 19738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 19748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 19758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 19768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) { 19798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 19808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "ccmp")) 19818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 198461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_GCMP) { 198561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 198661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt &iter_array, "gcmp")) 198761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto nomem; 198861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 198961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 19908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) { 19918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 19928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "tkip")) 19938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) { 19978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 19988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "none")) 19998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_end_string_array(&iter_dict, 20038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 20048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 20058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 20068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** group cipher */ 20108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 20118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { 20128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "ccmp", "tkip", "wep104", "wep40" 20138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }; 20148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 20158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "Group", args, 20168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(args) / sizeof(char*))) 20178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 20198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Group", 20208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 20218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 20228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 20238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) { 20268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 20278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "ccmp")) 20288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 203161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_GCMP) { 203261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 203361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt &iter_array, "gcmp")) 203461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto nomem; 203561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 203661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 20378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) { 20388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 20398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "tkip")) 20408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_WEP104) { 20448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 20458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wep104")) 20468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_WEP40) { 20508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 20518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wep40")) 20528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_end_string_array(&iter_dict, 20568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 20578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 20588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 20598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** key management */ 20638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 20648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { 20658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa-psk", "wpa-eap", "ieee8021x", "wpa-none", 20668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 20678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wps", 20688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 20698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "none" 20708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }; 20718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 20728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "KeyMgmt", args, 20738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(args) / sizeof(char*))) 20748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 20768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "KeyMgmt", 20778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 20788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 20798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 20808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element(&iter_array, 20838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "none")) 20848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element(&iter_array, 20878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "ieee8021x")) 20888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA | 20918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2)) { 20928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 20938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-eap")) 20948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_FT) 20978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 20988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-ft-eap")) 20998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 21008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */ 21028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 21038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 21048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-eap-sha256")) 21058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 21068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 21078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK | 21108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) { 21118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 21128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-psk")) 21138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 21148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_FT_PSK) 21168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 21178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-ft-psk")) 21188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 21198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */ 21218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 21228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 21238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-psk-sha256")) 21248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 21258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 21268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) { 21298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 21308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-none")) 21318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 21328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 21368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element(&iter_array, 21378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wps")) 21388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 21398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 21408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_end_string_array(&iter_dict, 21428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 21438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 21448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 21458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 21468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** WPA protocol */ 21498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 21508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { "rsn", "wpa" }; 21518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 21528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "Protocol", args, 21538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(args) / sizeof(char*))) 21548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 21558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 21568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Protocol", 21578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 21588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 21598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 21608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 21618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA2 | 21638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) { 21648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 21658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "rsn")) 21668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 21678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA | 21708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK)) { 21718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 21728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa")) 21738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 21748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_end_string_array(&iter_dict, 21778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 21788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 21798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 21808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 21818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** auth alg */ 21848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 21858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { "open", "shared", "leap" }; 21868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 21878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "AuthAlg", args, 21888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(args) / sizeof(char*))) 21898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 21908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 21918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "AuthAlg", 21928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 21938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 21948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 21958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 21968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.auth & (WPA_DRIVER_AUTH_OPEN)) { 21988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 21998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "open")) 22008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 22018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.auth & (WPA_DRIVER_AUTH_SHARED)) { 22048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 22058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "shared")) 22068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 22078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.auth & (WPA_DRIVER_AUTH_LEAP)) { 22108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 22118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "leap")) 22128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 22138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_end_string_array(&iter_dict, 22168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 22178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 22188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 22198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 22208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** Scan */ 22238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array(&iter_dict, "Scan", scans, 22248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(scans) / sizeof(char *))) 22258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 22268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** Modes */ 222875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Modes", 222975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_entry, 223075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_val, 223175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_array)) 22328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 22338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 223475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!wpa_dbus_dict_string_array_add_element( 223575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_array, "infrastructure")) 223675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen goto nomem; 223775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen 223875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!wpa_dbus_dict_string_array_add_element( 223975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_array, "ad-hoc")) 224075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen goto nomem; 224175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen 224275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (res >= 0) { 224375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (capa.flags & (WPA_DRIVER_FLAGS_AP)) { 224475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!wpa_dbus_dict_string_array_add_element( 224575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_array, "ap")) 224675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen goto nomem; 224775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen } 224875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen 224975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (capa.flags & (WPA_DRIVER_FLAGS_P2P_CAPABLE)) { 225075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!wpa_dbus_dict_string_array_add_element( 225175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_array, "p2p")) 225275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen goto nomem; 225375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen } 225475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen } 225575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen 225675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!wpa_dbus_dict_end_string_array(&iter_dict, 225775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_entry, 225875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_val, 225975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_array)) 226075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen goto nomem; 226175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen /***** Modes end */ 226275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen 22631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (res >= 0) { 22641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_int32_t max_scan_ssid = capa.max_scan_ssids; 22651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 22661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpa_dbus_dict_append_int32(&iter_dict, "MaxScanSSID", 22671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt max_scan_ssid)) 22681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto nomem; 22691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 22701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 22718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict)) 22728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 22731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_close_container(iter, &variant_iter)) 22748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 22758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 22778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem: 22791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 22801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 22818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 22828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 22858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_state - Get interface state 22861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 22871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 22881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 22891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 22908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 22918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "State" property. 22928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 22931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_state(DBusMessageIter *iter, DBusError *error, 22941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 22958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 22961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 22978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *str_state; 22988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *state_ls, *tmp; 22991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 23008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt str_state = wpa_supplicant_state_txt(wpa_s->wpa_state); 23028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* make state string lowercase to fit new DBus API convention 23048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 23058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt state_ls = tmp = os_strdup(str_state); 23068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!tmp) { 23071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 23081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 23098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 23108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*tmp) { 23118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *tmp = tolower(*tmp); 23128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tmp++; 23138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 23148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 23161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &state_ls, error); 23178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(state_ls); 23198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 23218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 23228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 23258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_get_scanning - Get interface scanning state 23261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 23271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 23281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 23291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 23308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 23318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "scanning" property. 23328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 23331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_scanning(DBusMessageIter *iter, DBusError *error, 23341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 23358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 23361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 23378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t scanning = wpa_s->scanning ? TRUE : FALSE; 23381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 23391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 23401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &scanning, error); 23418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 23428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 23458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ap_scan - Control roaming mode 23461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 23471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 23481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 23491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 23508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 23518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "ApScan" property. 23528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 23531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_ap_scan(DBusMessageIter *iter, DBusError *error, 23541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 23558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 23561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 23578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t ap_scan = wpa_s->conf->ap_scan; 23581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 23591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, 23601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &ap_scan, error); 23618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 23628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 23658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_ap_scan - Control roaming mode 23661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 23671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 23681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 23691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 23708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 23718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "ApScan" property. 23728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 23731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_ap_scan(DBusMessageIter *iter, DBusError *error, 23741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 23758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 23761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 23778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t ap_scan; 23788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32, 23801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &ap_scan)) 23811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 23828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_set_ap_scan(wpa_s, ap_scan)) { 23841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 23851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "ap_scan must be 0, 1, or 2"); 23861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 23878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 23881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 23898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 23908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 2393c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * wpas_dbus_getter_fast_reauth - Control fast 2394c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * reauthentication (TLS session resumption) 2395c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 2396c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @error: Location to store error on failure 2397c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @user_data: Function specific data 2398c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Returns: TRUE on success, FALSE on failure 2399c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * 2400c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Getter function for "FastReauth" property. 2401c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt */ 2402c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidtdbus_bool_t wpas_dbus_getter_fast_reauth(DBusMessageIter *iter, 2403c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt DBusError *error, 2404c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt void *user_data) 2405c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt{ 2406c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 2407c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt dbus_bool_t fast_reauth = wpa_s->conf->fast_reauth ? TRUE : FALSE; 2408c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2409c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 2410c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt &fast_reauth, error); 2411c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt} 2412c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2413c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2414c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt/** 2415c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * wpas_dbus_setter_fast_reauth - Control fast 2416c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * reauthentication (TLS session resumption) 2417c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 2418c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @error: Location to store error on failure 2419c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @user_data: Function specific data 2420c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Returns: TRUE on success, FALSE on failure 2421c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * 2422c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Setter function for "FastReauth" property. 2423c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt */ 2424c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidtdbus_bool_t wpas_dbus_setter_fast_reauth(DBusMessageIter *iter, 2425c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt DBusError *error, 2426c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt void *user_data) 2427c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt{ 2428c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 2429c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt dbus_bool_t fast_reauth; 2430c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2431c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, 2432c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt &fast_reauth)) 2433c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return FALSE; 2434c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2435c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt wpa_s->conf->fast_reauth = fast_reauth; 2436c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return TRUE; 2437c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt} 2438c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2439c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2440c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt/** 244104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_getter_disconnect_reason - Get most recent reason for disconnect 244204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 244304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure 244404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data 244504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 244604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 244704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Getter for "DisconnectReason" property. The reason is negative if it is 244804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * locally generated. 244904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 245004949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_getter_disconnect_reason(DBusMessageIter *iter, 245104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusError *error, 245204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt void *user_data) 245304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 245404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 245504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_int32_t reason = wpa_s->disconnect_reason; 245604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32, 245704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt &reason, error); 245804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 245904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 246004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 246104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 24628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_age - Get BSS entry expiration age 24631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 24641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 24651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 24661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 24678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 24688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "BSSExpireAge" property. 24698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 24701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_expire_age(DBusMessageIter *iter, 24711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 24721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 24738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 24741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 24758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t expire_age = wpa_s->conf->bss_expiration_age; 24761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 24771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, 24781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &expire_age, error); 24798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 24808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 24838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_age - Control BSS entry expiration age 24841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 24851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 24861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 24871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 24888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 24898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "BSSExpireAge" property. 24908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 24911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_bss_expire_age(DBusMessageIter *iter, 24921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 24931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 24948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 24951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 24968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t expire_age; 24978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32, 24991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &expire_age)) 25001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 25018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_set_bss_expiration_age(wpa_s, expire_age)) { 25031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 25041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "BSSExpireAge must be >= 10"); 25051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 25068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 25088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 25098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 25128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_count - Get BSS entry expiration scan count 25131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 25141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 25151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 25161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 25178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 25188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "BSSExpireCount" property. 25198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 25201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_expire_count(DBusMessageIter *iter, 25211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 25221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 25238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 25241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 252561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt dbus_uint32_t expire_count = wpa_s->conf->bss_expiration_scan_count; 25261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 25271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, 25281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &expire_count, error); 25298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 25308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 25338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_count - Control BSS entry expiration scan count 25341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 25351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 25361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 25371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 25388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 25398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "BSSExpireCount" property. 25408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 25411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_bss_expire_count(DBusMessageIter *iter, 25421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 25431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 25448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 25451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 25468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t expire_count; 25478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32, 25491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &expire_count)) 25501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 25518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_set_bss_expiration_count(wpa_s, expire_count)) { 25531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 25541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "BSSExpireCount must be > 0"); 25551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 25568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 25588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 25598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 25628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_country - Control country code 25631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 25641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 25651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 25661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 25678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 25688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "Country" property. 25698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 25701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_country(DBusMessageIter *iter, DBusError *error, 25711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 25728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 25731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 25748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char country[3]; 25758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *str = country; 25768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt country[0] = wpa_s->conf->country[0]; 25788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt country[1] = wpa_s->conf->country[1]; 25798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt country[2] = '\0'; 25808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 25821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &str, error); 25838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 25848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 25878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_country - Control country code 25881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 25891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 25901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 25911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 25928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 25938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "Country" property. 25948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 25951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_country(DBusMessageIter *iter, DBusError *error, 25961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 25978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 25981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 25998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *country; 26008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING, 26021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &country)) 26031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 26048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!country[0] || !country[1]) { 26061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 26071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "invalid country code"); 26081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 26091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 26108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->drv_priv != NULL && wpa_drv_set_country(wpa_s, country)) { 26128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "Failed to set country"); 26131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 26141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "failed to set country code"); 26151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 26168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->conf->country[0] = country[0]; 26198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->conf->country[1] = country[1]; 26201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 26218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 26228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 262504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_getter_scan_interval - Get scan interval 262604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 262704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure 262804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data 262904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 263004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 263104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Getter function for "ScanInterval" property. 263204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 263304949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_getter_scan_interval(DBusMessageIter *iter, 263404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusError *error, 263504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt void *user_data) 263604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 263704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 263804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_int32_t scan_interval = wpa_s->scan_interval; 263904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 264004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32, 264104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt &scan_interval, error); 264204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 264304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 264404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 264504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 264604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_setter_scan_interval - Control scan interval 264704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 264804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure 264904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data 265004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 265104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 265204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Setter function for "ScanInterval" property. 265304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 265404949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_setter_scan_interval(DBusMessageIter *iter, 265504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusError *error, 265604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt void *user_data) 265704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 265804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 265904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_int32_t scan_interval; 266004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 266104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_INT32, 266204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt &scan_interval)) 266304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 266404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 266504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_supplicant_set_scan_interval(wpa_s, scan_interval)) { 266604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 266704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "scan_interval must be >= 0"); 266804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 266904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 267004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return TRUE; 267104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 267204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 267304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 267404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 26758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ifname - Get interface name 26761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 26771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 26781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 26791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 26808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 26818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Ifname" property. 26828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 26831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_ifname(DBusMessageIter *iter, DBusError *error, 26841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 26858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 26861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 26878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *ifname = wpa_s->ifname; 26881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 26891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 26901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &ifname, error); 26918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 26928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 26958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_driver - Get interface name 26961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 26971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 26981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 26991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 27008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 27018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Driver" property. 27028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 27031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_driver(DBusMessageIter *iter, DBusError *error, 27041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 27058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 27061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 27078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *driver; 27088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->driver == NULL || wpa_s->driver->name == NULL) { 27108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_getter_driver[dbus]: " 27118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa_s has no driver set"); 27121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, "%s: no driver set", 27131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt __func__); 27141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 27158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 27168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt driver = wpa_s->driver->name; 27181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 27191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &driver, error); 27208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 27248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_bss - Get current bss object path 27251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 27261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 27271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 27281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 27298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 27308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentBSS" property. 27318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 27321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_bss(DBusMessageIter *iter, 27331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 27341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 27358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 27361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 27378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *bss_obj_path = path_buf; 27388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->current_bss) 27408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, 27418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u", 27428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, wpa_s->current_bss->id); 27438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 27448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/"); 27458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_OBJECT_PATH, 27471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &bss_obj_path, error); 27488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 27528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_network - Get current network object path 27531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 27541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 27551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 27561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 27578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 27588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentNetwork" property. 27598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 27601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_network(DBusMessageIter *iter, 27611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 27621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 27638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 27641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 27658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *net_obj_path = path_buf; 27668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->current_ssid) 27688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, 27698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u", 27708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, wpa_s->current_ssid->id); 27718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 27728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/"); 27738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_OBJECT_PATH, 27751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &net_obj_path, error); 27768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 27808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_auth_mode - Get current authentication type 27811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 27821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 27831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 27841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 27858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 27868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentAuthMode" property. 27878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 27881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_auth_mode(DBusMessageIter *iter, 27891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 27901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 27918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 27921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 27938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *eap_mode; 27948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *auth_mode; 27958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char eap_mode_buf[WPAS_DBUS_AUTH_MODE_MAX]; 27968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->wpa_state != WPA_COMPLETED) { 27988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt auth_mode = "INACTIVE"; 27998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X || 28008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) { 28018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eap_mode = wpa_supplicant_get_eap_mode(wpa_s); 28028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(eap_mode_buf, WPAS_DBUS_AUTH_MODE_MAX, 28038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "EAP-%s", eap_mode); 28048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt auth_mode = eap_mode_buf; 28058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 28078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt auth_mode = wpa_key_mgmt_txt(wpa_s->key_mgmt, 28088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->current_ssid->proto); 28098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 28108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 28121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &auth_mode, error); 28138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 28148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 28178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bridge_ifname - Get interface name 28181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 28191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 28201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 28211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 28228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 28238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BridgeIfname" property. 28248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 28251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bridge_ifname(DBusMessageIter *iter, 28261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 28271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 28288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 28291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 28301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const char *bridge_ifname = wpa_s->bridge_ifname; 28311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 28321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &bridge_ifname, error); 28338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 28348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 28378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bsss - Get array of BSSs objects 28381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 28391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 28401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 28411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 28428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 28438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSs" property. 28448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 28451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bsss(DBusMessageIter *iter, DBusError *error, 28461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 28478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 28481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 28498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_bss *bss; 28508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **paths; 28518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int i = 0; 28521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 28538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 285461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt paths = os_calloc(wpa_s->num_bss, sizeof(char *)); 28558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!paths) { 28561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 28571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 28588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 28598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Loop through scan results and append each result's object path */ 28618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dl_list_for_each(bss, &wpa_s->bss_id, struct wpa_bss, list_id) { 28628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX); 28638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (paths[i] == NULL) { 28641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, 28651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "no memory"); 28668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 28678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 28688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Construct the object path for this BSS. */ 28698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX, 28708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u", 28718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, bss->id); 28728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 28738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, 28751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_OBJECT_PATH, 28761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt paths, wpa_s->num_bss, 28771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 28788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 28808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (i) 28818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths[--i]); 28828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths); 28831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 28848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 28858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 28888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_networks - Get array of networks objects 28891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 28901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 28911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 28921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 28938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 28948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Networks" property. 28958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 28961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_networks(DBusMessageIter *iter, DBusError *error, 28971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 28988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 28991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 29008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 29018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **paths; 29028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int i = 0, num = 0; 29031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 29048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->conf == NULL) { 29061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_ERROR, "%s[dbus]: An error occurred getting " 29071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "networks list.", __func__); 29081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, "%s: an error " 29091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "occurred getting the networks list", __func__); 29101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 29118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 29128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) 291475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!network_is_persistent_group(ssid)) 291575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen num++; 29168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 291761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt paths = os_calloc(num, sizeof(char *)); 29188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!paths) { 29191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_NO_MEMORY, "no memory"); 29201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 29218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 29228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Loop through configured networks and append object path of each */ 29248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) { 292575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (network_is_persistent_group(ssid)) 292675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen continue; 29278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX); 29288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (paths[i] == NULL) { 29291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_NO_MEMORY, "no memory"); 29308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 29318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 29328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Construct the object path for this network. */ 29348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX, 29358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d", 29368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, ssid->id); 29378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 29388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, 29401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_OBJECT_PATH, 29411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt paths, num, error); 29428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 29448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (i) 29458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths[--i]); 29468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths); 29471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 29488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 29498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 29528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_blobs - Get all blobs defined for this interface 29531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 29541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 29551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 29561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 29578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 29588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Blobs" property. 29598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 29601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_blobs(DBusMessageIter *iter, DBusError *error, 29611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 29628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 29631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 29641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter, dict_iter, entry_iter, array_iter; 29658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_config_blob *blob; 29668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 29688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "a{say}", &variant_iter) || 29698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY, 29708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "{say}", &dict_iter)) { 29711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 29721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 29738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 29748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = wpa_s->conf->blobs; 29768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (blob) { 29778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_open_container(&dict_iter, 29788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_DICT_ENTRY, 29798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL, &entry_iter) || 29808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_append_basic(&entry_iter, 29818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_STRING, 29828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &(blob->name)) || 29838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_open_container(&entry_iter, 29848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_ARRAY, 29858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_BYTE_AS_STRING, 29868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &array_iter) || 29878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_append_fixed_array(&array_iter, 29888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_BYTE, 29898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &(blob->data), 29908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->len) || 29918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_close_container(&entry_iter, 29928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &array_iter) || 29938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_close_container(&dict_iter, 29948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &entry_iter)) { 29951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, 29961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "no memory"); 29971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 29988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 29998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = blob->next; 30018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 30028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_close_container(&variant_iter, &dict_iter) || 30041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) { 30051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 30061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 30078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 30088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 30101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 30111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 30121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 30131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic struct wpa_bss * get_bss_helper(struct bss_handler_args *args, 30141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, const char *func_name) 30151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 30161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res = wpa_bss_get_id(args->wpa_s, args->id); 30171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 30181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) { 30191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_ERROR, "%s[dbus]: no bss with id %d found", 30201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt func_name, args->id); 30211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 30221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: BSS %d not found", 30231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt func_name, args->id); 30241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 30251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 30261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return res; 30278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 30318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_bssid - Return the BSSID of a BSS 30321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 30331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 30341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 30351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 30368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 30378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSID" property. 30388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 30391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_bssid(DBusMessageIter *iter, DBusError *error, 30401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 30418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 30431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 30448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 30461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 30471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 30488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE, 30501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res->bssid, ETH_ALEN, 30511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 30528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 30568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ssid - Return the SSID of a BSS 30571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 30581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 30591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 30601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 30618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 30628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "SSID" property. 30638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 30641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_ssid(DBusMessageIter *iter, DBusError *error, 30651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 30668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 30681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 30698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 30711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 30721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 30738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE, 30751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res->ssid, res->ssid_len, 30761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 30778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 30818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_privacy - Return the privacy flag of a BSS 30821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 30831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 30841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 30851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 30868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 30878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Privacy" property. 30888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 30891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_privacy(DBusMessageIter *iter, 30901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 30918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 30931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 30948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t privacy; 30958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 30971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 30981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 30998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt privacy = (res->caps & IEEE80211_CAP_PRIVACY) ? TRUE : FALSE; 31011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 31021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &privacy, error); 31038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 31078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_mode - Return the mode of a BSS 31081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 31091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 31101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 31111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 31128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 31138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Mode" property. 31148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 31151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_mode(DBusMessageIter *iter, DBusError *error, 31161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 31178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 31191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 31208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *mode; 31218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 31231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 31241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 31258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res->caps & IEEE80211_CAP_IBSS) 31278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mode = "ad-hoc"; 31288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 31298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mode = "infrastructure"; 31308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 31321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &mode, error); 31338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 31378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_level - Return the signal strength of a BSS 31381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 31391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 31401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 31411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 31428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 31438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Level" property. 31448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 31451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_signal(DBusMessageIter *iter, 31461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 31478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 31491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 3150c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt s16 level; 31518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 31531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 31541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 31558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3156c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt level = (s16) res->level; 31571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT16, 3158c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt &level, error); 31598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 31638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_frequency - Return the frequency of a BSS 31641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 31651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 31661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 31671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 31688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 31698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Frequency" property. 31708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 31711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_frequency(DBusMessageIter *iter, 31721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 31738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 31751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 3176c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt u16 freq; 31778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 31791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 31801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 31818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3182c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt freq = (u16) res->freq; 31831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT16, 3184c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt &freq, error); 31858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int cmp_u8s_desc(const void *a, const void *b) 31898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return (*(u8 *) b - *(u8 *) a); 31918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 31958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rates - Return available bit rates of a BSS 31961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 31971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 31981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 31991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 32008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 32018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Rates" property. 32028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 32031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_rates(DBusMessageIter *iter, 32041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 32058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 32061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 32071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 32088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *ie_rates = NULL; 32098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u32 *real_rates; 32108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int rates_num, i; 32111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 32128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 32141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 32151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 32168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt rates_num = wpa_bss_get_bit_rates(res, &ie_rates); 32188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (rates_num < 0) 32191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 32208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt qsort(ie_rates, rates_num, 1, cmp_u8s_desc); 32228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt real_rates = os_malloc(sizeof(u32) * rates_num); 32248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!real_rates) { 32258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ie_rates); 32261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 32271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 32288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 32298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < rates_num; i++) 32318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt real_rates[i] = ie_rates[i] * 500000; 32328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_UINT32, 32341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt real_rates, rates_num, 32351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 32368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ie_rates); 32388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(real_rates); 32391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 32408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 32418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic dbus_bool_t wpas_dbus_get_bss_security_prop(DBusMessageIter *iter, 32441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_ie_data *ie_data, 32451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error) 32468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 32471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter iter_dict, variant_iter; 32488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *group; 324961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt const char *pairwise[3]; /* max 3 pairwise ciphers is supported */ 32508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *key_mgmt[7]; /* max 7 key managements may be supported */ 32518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int n; 32528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 32548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "a{sv}", &variant_iter)) 32558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 32568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict)) 32588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 32598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* KeyMgmt */ 32618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt n = 0; 32628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK) 32638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-psk"; 32648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_PSK) 32658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-ft-psk"; 32668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK_SHA256) 32678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-psk-sha256"; 32688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X) 32698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-eap"; 32708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X) 32718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-ft-eap"; 32728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256) 32738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-eap-sha256"; 32748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_NONE) 32758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-none"; 32768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array(&iter_dict, "KeyMgmt", 32788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt, n)) 32798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 32808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Group */ 32828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (ie_data->group_cipher) { 32838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_WEP40: 32848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "wep40"; 32858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 32868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_TKIP: 32878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "tkip"; 32888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 32898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_CCMP: 32908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "ccmp"; 32918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 329261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt case WPA_CIPHER_GCMP: 329361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt group = "gcmp"; 329461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt break; 32958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_WEP104: 32968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "wep104"; 32978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 32988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 32998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = ""; 33008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 33018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string(&iter_dict, "Group", group)) 33048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 33058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Pairwise */ 33078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt n = 0; 33088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_TKIP) 33098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pairwise[n++] = "tkip"; 33108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_CCMP) 33118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pairwise[n++] = "ccmp"; 331261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_GCMP) 331361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pairwise[n++] = "gcmp"; 33148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array(&iter_dict, "Pairwise", 33168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pairwise, n)) 33178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 33188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Management group (RSN only) */ 33208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->proto == WPA_PROTO_RSN) { 33218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (ie_data->mgmt_group_cipher) { 33228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 33238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_AES_128_CMAC: 33248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "aes128cmac"; 33258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 33268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 33278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 33288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = ""; 33298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 33308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string(&iter_dict, "MgmtGroup", 33338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group)) 33348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 33358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict)) 33388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 33391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_close_container(iter, &variant_iter)) 33408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 33418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 33438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem: 33451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 33461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 33478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 33488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 33518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_wpa - Return the WPA options of a BSS 33521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 33531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 33541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 33551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 33568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 33578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "WPA" property. 33588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 33591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_wpa(DBusMessageIter *iter, DBusError *error, 33601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 33618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 33621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 33631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 33648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ie_data wpa_data; 33658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *ie; 33668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 33681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 33691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 33708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&wpa_data, 0, sizeof(wpa_data)); 33728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie = wpa_bss_get_vendor_ie(res, WPA_IE_VENDOR_TYPE); 33738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie) { 33741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0) { 33751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 33761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "failed to parse WPA IE"); 33771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 33781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 33798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_get_bss_security_prop(iter, &wpa_data, error); 33828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 33838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 33868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rsn - Return the RSN options of a BSS 33871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 33881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 33891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 33901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 33918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 33928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "RSN" property. 33938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 33941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_rsn(DBusMessageIter *iter, DBusError *error, 33951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 33968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 33971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 33981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 33998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ie_data wpa_data; 34008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *ie; 34018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 34031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 34041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 34058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&wpa_data, 0, sizeof(wpa_data)); 34078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie = wpa_bss_get_ie(res, WLAN_EID_RSN); 34088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie) { 34091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0) { 34101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 34111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "failed to parse RSN IE"); 34121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 34131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 34148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 34158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_get_bss_security_prop(iter, &wpa_data, error); 34178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 34188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 3421d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * wpas_dbus_getter_bss_wps - Return the WPS options of a BSS 3422d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @iter: Pointer to incoming dbus message iter 3423d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @error: Location to store error on failure 3424d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @user_data: Function specific data 3425d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Returns: TRUE on success, FALSE on failure 3426d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * 3427d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Getter for "WPS" property. 3428d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt */ 3429d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_wps(DBusMessageIter *iter, DBusError *error, 3430d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt void *user_data) 3431d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{ 3432d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt struct bss_handler_args *args = user_data; 3433d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt struct wpa_bss *res; 3434d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_WPS 3435d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt struct wpabuf *wps_ie; 3436d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_WPS */ 3437d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt DBusMessageIter iter_dict, variant_iter; 3438d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt const char *type = ""; 3439d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3440d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt res = get_bss_helper(args, error, __func__); 3441d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (!res) 3442d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return FALSE; 3443d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3444d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 3445d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt "a{sv}", &variant_iter)) 3446d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt goto nomem; 3447d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3448d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict)) 3449d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt goto nomem; 3450d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3451d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_WPS 3452d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt wps_ie = wpa_bss_get_vendor_ie_multi(res, WPS_IE_VENDOR_TYPE); 3453d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (wps_ie) { 3454d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (wps_is_selected_pbc_registrar(wps_ie)) 3455d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt type = "pbc"; 3456d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt else if (wps_is_selected_pin_registrar(wps_ie)) 3457d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt type = "pin"; 3458d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt } 3459d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_WPS */ 3460d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3461d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (!wpa_dbus_dict_append_string(&iter_dict, "Type", type)) 3462d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt goto nomem; 3463d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3464d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict)) 3465d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt goto nomem; 3466d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (!dbus_message_iter_close_container(iter, &variant_iter)) 3467d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt goto nomem; 3468d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3469d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return TRUE; 3470d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3471d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtnomem: 3472d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 3473d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return FALSE; 3474d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt} 3475d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3476d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3477d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt/** 34788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ies - Return all IEs of a BSS 34791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 34801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 34811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 34821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 34838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 34848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "IEs" property. 34858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 34861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_ies(DBusMessageIter *iter, DBusError *error, 34871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 34888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 34891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 34901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 34918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 34931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 34941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 34958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE, 34971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res + 1, res->ie_len, 34981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 34998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 35038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_enabled - Check whether network is enabled or disabled 35041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 35051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 35061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 35071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 35088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 35098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "enabled" property of a configured network. 35108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 35111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_enabled(DBusMessageIter *iter, DBusError *error, 35121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 35138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct network_handler_args *net = user_data; 35158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t enabled = net->ssid->disabled ? FALSE : TRUE; 35161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 35171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 35181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &enabled, error); 35198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 35238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_enabled - Mark a configured network as enabled or disabled 35241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 35251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 35261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 35271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 35288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 35298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Enabled" property of a configured network. 35308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 35311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_enabled(DBusMessageIter *iter, DBusError *error, 35321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 35338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct network_handler_args *net = user_data; 35358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 35368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 35378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t enable; 35388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, 35401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &enable)) 35411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 35428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s = net->wpa_s; 35448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = net->ssid; 35458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (enable) 35478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_enable_network(wpa_s, ssid); 35488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 35498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_disable_network(wpa_s, ssid); 35508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 35528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 35568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_network_properties - Get options for a configured network 35571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 35581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 35591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 35601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 35618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 35628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Properties" property of a configured network. 35638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 35641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_network_properties(DBusMessageIter *iter, 35651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 35661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 35678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct network_handler_args *net = user_data; 35691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter, dict_iter; 35708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **iterator; 35718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **props = wpa_config_get_all(net->ssid, 1); 35721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 35738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!props) { 35751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 35761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 35778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 35788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, "a{sv}", 35801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &variant_iter) || 35818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !wpa_dbus_dict_open_write(&variant_iter, &dict_iter)) { 35821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 35838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 35848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 35858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator = props; 35878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*iterator) { 35888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string(&dict_iter, *iterator, 35898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *(iterator + 1))) { 35901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, 35911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "no memory"); 35928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 35938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 35948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator += 2; 35958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 35968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_close_write(&variant_iter, &dict_iter) || 35991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) { 36001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 36018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 36028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 36038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = TRUE; 36051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 36068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 36078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator = props; 36088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*iterator) { 36098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(*iterator); 36108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator++; 36118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 36128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(props); 36131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 36148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 36158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 36188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_network_properties - Set options for a configured network 36191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 36201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 36211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 36221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 36238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 36248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Properties" property of a configured network. 36258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 36261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_network_properties(DBusMessageIter *iter, 36271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 36281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 36298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 36301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct network_handler_args *net = user_data; 36318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid = net->ssid; 36321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter; 36338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_message_iter_recurse(iter, &variant_iter); 36351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return set_network_properties(net->wpa_s, ssid, &variant_iter, error); 36368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 363704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 363804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 363904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AP 364004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 364104949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_subscribe_preq( 364204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessage *message, struct wpa_supplicant *wpa_s) 364304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 364404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpas_dbus_priv *priv = wpa_s->global->dbus; 364504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *name; 364604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 364704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_s->preq_notify_peer != NULL) { 364804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strcmp(dbus_message_get_sender(message), 364904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->preq_notify_peer) == 0) 365004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 365104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 365204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return dbus_message_new_error(message, 365304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_DBUS_ERROR_SUBSCRIPTION_IN_USE, 365404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "Another application is already subscribed"); 365504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 365604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 365704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt name = os_strdup(dbus_message_get_sender(message)); 365804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!name) 365904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 366004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "out of memory"); 366104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 366204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->preq_notify_peer = name; 366304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 366404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* Subscribe to clean up if application closes socket */ 366504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpas_dbus_subscribe_noc(priv); 366604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 366704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* 366804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Double-check it's still alive to make sure that we didn't 366904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * miss the NameOwnerChanged signal, e.g. while strdup'ing. 367004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 367104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_bus_name_has_owner(priv->con, name, NULL)) { 367204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* 367304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Application no longer exists, clean up. 367404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * The return value is irrelevant now. 367504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 367604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Need to check if the NameOwnerChanged handling 367704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * already cleaned up because we have processed 367804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * DBus messages while checking if the name still 367904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * has an owner. 368004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 368104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpa_s->preq_notify_peer) 368204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 368304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(wpa_s->preq_notify_peer); 368404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->preq_notify_peer = NULL; 368504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpas_dbus_unsubscribe_noc(priv); 368604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 368704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 368804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 368904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 369004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 369104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 369204949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_unsubscribe_preq( 369304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessage *message, struct wpa_supplicant *wpa_s) 369404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 369504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpas_dbus_priv *priv = wpa_s->global->dbus; 369604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 369704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpa_s->preq_notify_peer) 369804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return dbus_message_new_error(message, 369904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_DBUS_ERROR_NO_SUBSCRIPTION, 370004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "Not subscribed"); 370104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 370204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strcmp(wpa_s->preq_notify_peer, 370304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_get_sender(message))) 370404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return dbus_message_new_error(message, 370504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_DBUS_ERROR_SUBSCRIPTION_EPERM, 370604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "Can't unsubscribe others"); 370704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 370804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(wpa_s->preq_notify_peer); 370904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->preq_notify_peer = NULL; 371004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpas_dbus_unsubscribe_noc(priv); 371104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 371204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 371304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 371404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 371504949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid wpas_dbus_signal_preq(struct wpa_supplicant *wpa_s, 371604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const u8 *addr, const u8 *dst, const u8 *bssid, 371704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const u8 *ie, size_t ie_len, u32 ssi_signal) 371804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 371904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessage *msg; 372004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessageIter iter, dict_iter; 372104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpas_dbus_priv *priv = wpa_s->global->dbus; 372204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 372304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* Do nothing if the control interface is not turned on */ 372404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (priv == NULL) 372504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return; 372604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 372704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_s->preq_notify_peer == NULL) 372804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return; 372904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 373004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt msg = dbus_message_new_signal(wpa_s->dbus_new_path, 373104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_DBUS_NEW_IFACE_INTERFACE, 373204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "ProbeRequest"); 373304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (msg == NULL) 373404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return; 373504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 373604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_set_destination(msg, wpa_s->preq_notify_peer); 373704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 373804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_iter_init_append(msg, &iter); 373904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 374004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpa_dbus_dict_open_write(&iter, &dict_iter)) 374104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto fail; 374204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (addr && !wpa_dbus_dict_append_byte_array(&dict_iter, "addr", 374304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt (const char *) addr, 374404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ETH_ALEN)) 374504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto fail; 374604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (dst && !wpa_dbus_dict_append_byte_array(&dict_iter, "dst", 374704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt (const char *) dst, 374804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ETH_ALEN)) 374904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto fail; 375004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (bssid && !wpa_dbus_dict_append_byte_array(&dict_iter, "bssid", 375104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt (const char *) bssid, 375204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ETH_ALEN)) 375304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto fail; 375404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (ie && ie_len && !wpa_dbus_dict_append_byte_array(&dict_iter, "ies", 375504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt (const char *) ie, 375604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ie_len)) 375704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto fail; 375804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (ssi_signal && !wpa_dbus_dict_append_int32(&dict_iter, "signal", 375904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ssi_signal)) 376004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto fail; 376104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpa_dbus_dict_close_write(&iter, &dict_iter)) 376204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto fail; 376304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 376404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_connection_send(priv->con, msg, NULL); 376504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto out; 376604949598a23f501be6eec21697465fd46a28840aDmitry Shmidtfail: 376704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "dbus: Failed to construct signal"); 376804949598a23f501be6eec21697465fd46a28840aDmitry Shmidtout: 376904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_unref(msg); 377004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 377104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 377204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AP */ 3773