dbus_new_handlers.c revision 61d9df3e62aaa0e87ad05452fcb95142159a17b6
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" 241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#include "../ctrl_iface.h" 2504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include "../autoscan.h" 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_new_helpers.h" 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_new.h" 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_new_handlers.h" 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_dict_helpers.h" 3004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include "dbus_common_i.h" 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtextern int wpa_debug_level; 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtextern int wpa_debug_show_keys; 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtextern int wpa_debug_timestamp; 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *debug_strings[] = { 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "excessive", "msgdump", "debug", "info", "warning", "error", NULL 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_unknown_error - Return a new InvalidArgs error message 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @arg: Optional string appended to error message 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an UnknownError 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_error_unknown_error(DBusMessage *message, 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *arg) 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function can be called as a result of a failure 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * within internal getter calls, which will call this function 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * with a NULL message parameter. However, dbus_message_new_error 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * looks very unkindly (i.e, abort()) on a NULL message, so 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * in this case, we should not call it. 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (message == NULL) { 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_INFO, "dbus: wpas_dbus_error_unknown_error " 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "called with NULL message (arg=%s)", 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt arg ? arg : "N/A"); 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_UNKNOWN_ERROR, 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt arg); 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_iface_unknown - Return a new invalid interface error message 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus error message 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid interface error 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic DBusMessage * wpas_dbus_error_iface_unknown(DBusMessage *message) 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_IFACE_UNKNOWN, 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa_supplicant knows nothing about " 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "this interface."); 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_network_unknown - Return a new NetworkUnknown error message 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid network error 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic DBusMessage * wpas_dbus_error_network_unknown(DBusMessage *message) 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_NETWORK_UNKNOWN, 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "There is no such a network in this " 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "interface."); 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_invalid_args - Return a new InvalidArgs error message 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid options error 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_error_invalid_args(DBusMessage *message, 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *arg) 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply; 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, WPAS_DBUS_ERROR_INVALID_ARGS, 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Did not receive correct message " 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "arguments."); 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (arg != NULL) 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_append_args(reply, DBUS_TYPE_STRING, &arg, 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *dont_quote[] = { 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "key_mgmt", "proto", "pairwise", "auth_alg", "group", "eap", 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "opensc_engine_path", "pkcs11_engine_path", "pkcs11_module_path", 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "bssid", NULL 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic dbus_bool_t should_quote_opt(const char *key) 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i = 0; 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dont_quote[i] != NULL) { 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(key, dont_quote[i]) == 0) 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return FALSE; 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt i++; 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return TRUE; 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * get_iface_by_dbus_path - Get a new network interface 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: Pointer to global data from wpa_supplicant_init() 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @path: Pointer to a dbus object path representing an interface 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Pointer to the interface or %NULL if not found 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_supplicant * get_iface_by_dbus_path( 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global, const char *path) 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) { 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(wpa_s->dbus_new_path, path) == 0) 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_s; 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * set_network_properties - Set properties of a configured network 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @ssid: wpa_ssid structure for a configured network 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @iter: DBus message iterator containing dictionary of network 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * properties to set. 1661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: On failure, an error describing the failure 1671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request succeeds, FALSE if it failed 1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Sets network configuration with parameters given id DBus dictionary 1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t set_network_properties(struct wpa_supplicant *wpa_s, 1721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_ssid *ssid, 1731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter *iter, 1741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error) 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_dbus_dict_entry entry = { .type = DBUS_TYPE_STRING }; 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter_dict; 1781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char *value = NULL; 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpa_dbus_dict_open_read(iter, &iter_dict, error)) 1811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (wpa_dbus_dict_has_dict_entry(&iter_dict)) { 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t size = 50; 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 1861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpa_dbus_dict_get_entry(&iter_dict, &entry)) 1881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto error; 1891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt value = NULL; 1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (entry.type == DBUS_TYPE_ARRAY && 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.array_type == DBUS_TYPE_BYTE) { 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (entry.array_len <= 0) 1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size = entry.array_len * 2 + 1; 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = wpa_snprintf_hex(value, size, 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (u8 *) entry.bytearray_value, 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.array_len); 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret <= 0) 2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (entry.type == DBUS_TYPE_STRING) { 2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (should_quote_opt(entry.key)) { 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size = os_strlen(entry.str_value); 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (size <= 0) 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size += 3; 2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(value, size, "\"%s\"", 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.str_value); 2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || (size_t) ret != (size - 1)) 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_strdup(entry.str_value); 2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (entry.type == DBUS_TYPE_UINT32) { 2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(value, size, "%u", 2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.uint32_value); 2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret <= 0) 2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (entry.type == DBUS_TYPE_INT32) { 2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(value, size, "%d", 2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.int32_value); 2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret <= 0) 2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else 2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_set(ssid, entry.key, value, 0) < 0) 2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((os_strcmp(entry.key, "psk") == 0 && 2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value[0] == '"' && ssid->ssid_len) || 25204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt (os_strcmp(entry.key, "ssid") == 0 && ssid->passphrase)) 2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_update_psk(ssid); 2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (os_strcmp(entry.key, "priority") == 0) 2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_update_prio_list(wpa_s->conf); 2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 2621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidterror: 2641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(value); 2651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 2661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_INVALID_ARGS, 2671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "invalid message format"); 2681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_property_getter - Get basic type property 2741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Message iter to use when appending arguments 2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property (must be basic type) 2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @val: pointer to place holding property value 2771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: On failure an error describing the failure 2781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request was successful, FALSE if it failed 2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic getter for basic type properties. Type is required to be basic. 2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 2821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_property_getter(DBusMessageIter *iter, 2831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const int type, 2841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const void *val, 2851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error) 2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter; 2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_type_is_basic(type)) { 2901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 2911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: given type is not basic", __func__); 2921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 2961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_dbus_type_as_string(type), 2971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &variant_iter)) 2981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto error; 2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_append_basic(&variant_iter, type, val)) 3011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto error; 3021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_close_container(iter, &variant_iter)) 3041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto error; 3051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 3071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidterror: 3091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: error constructing reply", __func__); 3111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_property_setter - Set basic type property 3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property (must be basic type) 3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @val: pointer to place where value being set will be stored 3201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request was successful, FALSE if it failed 3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic setter for basic type properties. Type is required to be basic. 3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_property_setter(DBusMessageIter *iter, 3251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 3261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const int type, void *val) 3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter; 3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_type_is_basic(type)) { 3311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: given type is not basic", __func__); 3331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Look at the new value */ 3371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_message_iter_recurse(iter, &variant_iter); 3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&variant_iter) != type) { 3391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 3401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "wrong property type"); 3411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&variant_iter, val); 3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_array_property_getter - Get array type property 3511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iterator 3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property array elements (must be basic type) 3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @array: pointer to array of elements to put into response message 3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @array_len: length of above array 3551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: a pointer to an error to fill on failure 3561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request succeeded, FALSE if it failed 3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic getter for array type properties. Array elements type is 3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * required to be basic. 3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_array_property_getter(DBusMessageIter *iter, 3621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const int type, 3631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const void *array, 3641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt size_t array_len, 3651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error) 3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter, array_iter; 3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char type_str[] = "a?"; /* ? will be replaced with subtype letter; */ 3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *sub_type_str; 3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t element_size, i; 3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_type_is_basic(type)) { 3731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: given type is not basic", __func__); 3751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sub_type_str = wpa_dbus_type_as_string(type); 3798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt type_str[1] = sub_type_str[0]; 3808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 3821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt type_str, &variant_iter)) { 3831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: failed to construct message 1", __func__); 3851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY, 3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sub_type_str, &array_iter)) { 3901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: failed to construct message 2", __func__); 3921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch(type) { 3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_BYTE: 3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_BOOLEAN: 3988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = 1; 3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_INT16: 4018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_UINT16: 4028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(uint16_t); 4038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_INT32: 4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_UINT32: 4068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(uint32_t); 4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_INT64: 4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_UINT64: 4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(uint64_t); 4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_DOUBLE: 4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(double); 4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_STRING: 4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_OBJECT_PATH: 4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(char *); 4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 4201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 4211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: unknown element type %d", __func__, type); 4221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < array_len; i++) { 4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_append_basic(&array_iter, type, 4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt array + i * element_size); 4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_close_container(&variant_iter, &array_iter)) { 4311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 4321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: failed to construct message 3", __func__); 4331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_close_container(iter, &variant_iter)) { 4371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 4381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: failed to construct message 4", __func__); 4391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 4401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 4411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 4421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 44704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_simple_array_array_property_getter - Get array array type property 44804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iterator 44904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @type: DBus type of property array elements (must be basic type) 45004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @array: pointer to array of elements to put into response message 45104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @array_len: length of above array 45204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: a pointer to an error to fill on failure 45304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE if the request succeeded, FALSE if it failed 45404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 45504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Generic getter for array type properties. Array elements type is 45604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * required to be basic. 45704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 45804949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_simple_array_array_property_getter(DBusMessageIter *iter, 45904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const int type, 46004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpabuf **array, 46104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt size_t array_len, 46204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusError *error) 46304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 46404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessageIter variant_iter, array_iter; 46504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char type_str[] = "aa?"; 46604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char inner_type_str[] = "a?"; 46704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const char *sub_type_str; 46804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt size_t i; 46904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 47004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_type_is_basic(type)) { 47104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 47204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "%s: given type is not basic", __func__); 47304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 47404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 47504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 47604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt sub_type_str = wpa_dbus_type_as_string(type); 47704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt type_str[2] = sub_type_str[0]; 47804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt inner_type_str[1] = sub_type_str[0]; 47904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 48004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 48104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt type_str, &variant_iter)) { 48204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 48304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "%s: failed to construct message 1", __func__); 48404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 48504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 48604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY, 48704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt inner_type_str, &array_iter)) { 48804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 48904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "%s: failed to construct message 2", __func__); 49004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 49104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 49204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 49304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt for (i = 0; i < array_len; i++) { 49404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_dbus_dict_bin_array_add_element(&array_iter, 49504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpabuf_head(array[i]), 49604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpabuf_len(array[i])); 49704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 49804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 49904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 50004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_message_iter_close_container(&variant_iter, &array_iter)) { 50104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 50204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "%s: failed to close message 2", __func__); 50304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 50404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 50504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 50604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_message_iter_close_container(iter, &variant_iter)) { 50704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 50804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "%s: failed to close message 1", __func__); 50904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 51004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 51104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 51204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return TRUE; 51304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 51404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 51504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 51604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 5178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_create_interface - Request registration of a network iface 5188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure 5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the new interface object, 5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or a dbus error message with more information 5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "CreateInterface" method call. Handles requests 5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to register a network interface that wpa_supplicant 5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * will manage. 5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_create_interface(DBusMessage *message, 5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter_dict; 5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter; 5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_dbus_dict_entry entry; 5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *driver = NULL; 5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *ifname = NULL; 5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *confname = NULL; 5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *bridge_ifname = NULL; 5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpa_dbus_dict_open_read(&iter, &iter_dict, NULL)) 5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (wpa_dbus_dict_has_dict_entry(&iter_dict)) { 5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_get_entry(&iter_dict, &entry)) 5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 54604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!os_strcmp(entry.key, "Driver") && 5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (entry.type == DBUS_TYPE_STRING)) { 5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt driver = os_strdup(entry.str_value); 5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (driver == NULL) 5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 55204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (!os_strcmp(entry.key, "Ifname") && 5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (entry.type == DBUS_TYPE_STRING)) { 5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ifname = os_strdup(entry.str_value); 5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ifname == NULL) 5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 55804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (!os_strcmp(entry.key, "ConfigFile") && 5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (entry.type == DBUS_TYPE_STRING)) { 5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt confname = os_strdup(entry.str_value); 5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (confname == NULL) 5638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 56404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (!os_strcmp(entry.key, "BridgeIfname") && 5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (entry.type == DBUS_TYPE_STRING)) { 5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bridge_ifname = os_strdup(entry.str_value); 5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bridge_ifname == NULL) 5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ifname == NULL) 5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; /* Required Ifname argument missing */ 5788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Try to get the wpa_supplicant record for this iface, return 5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * an error if we already control it. 5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 5838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_get_iface(global, ifname) != NULL) { 5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, 5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPAS_DBUS_ERROR_IFACE_EXISTS, 5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa_supplicant already " 5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "controls this interface."); 5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 5908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_interface iface; 5918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&iface, 0, sizeof(iface)); 5928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.driver = driver; 5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.ifname = ifname; 5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.confname = confname; 5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.bridge_ifname = bridge_ifname; 5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Otherwise, have wpa_supplicant attach to it. */ 5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((wpa_s = wpa_supplicant_add_iface(global, &iface))) { 5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *path = wpa_s->dbus_new_path; 5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, 6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &path, DBUS_TYPE_INVALID); 6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_unknown_error( 6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "wpa_supplicant couldn't grab this " 6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "interface."); 6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(driver); 6118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ifname); 61261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_free(confname); 6138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bridge_ifname); 6148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterror: 6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, NULL); 6188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 6198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_interface - Request deregistration of an interface 6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 6258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: wpa_supplicant global data structure 6268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing a UINT32 indicating success (1) or 6278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * failure (0), or returns a dbus error message with more information 6288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 6298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "removeInterface" method call. Handles requests 6308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to deregister a network interface that wpa_supplicant 6318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * currently manages. 6328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 6338d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_interface(DBusMessage *message, 6348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 6358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 6378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *path; 6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 6398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &path, 6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 6428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s = get_iface_by_dbus_path(global, path); 6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s == NULL) 6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_iface_unknown(message); 646c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt else if (wpa_supplicant_remove_iface(global, wpa_s, 0)) { 6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_unknown_error( 6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "wpa_supplicant couldn't remove this " 6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "interface."); 6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_interface - Get the object path for an interface name 6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure 6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the interface object, 6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or a dbus error message with more information 6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "getInterface" method call. 6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_interface(DBusMessage *message, 6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *ifname; 6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *path; 6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &ifname, 6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s = wpa_supplicant_get_iface(global, ifname); 6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s == NULL) 6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_error_iface_unknown(message); 6798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt path = wpa_s->dbus_new_path; 6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply == NULL) 6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path, 6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID)) { 6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 6888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 6978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_level - Get debug level 6981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 6991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 7001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 7011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugLevel" property. 7048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_level(DBusMessageIter *iter, 7061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 7071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 7088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *str; 7108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int idx = wpa_debug_level; 7111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (idx < 0) 7138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt idx = 0; 7148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (idx > 5) 7158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt idx = 5; 7168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt str = debug_strings[idx]; 7171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 7181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &str, error); 7198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_timestamp - Get debug timestamp 7241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 7251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 7261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 7271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 7288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugTimestamp" property. 7308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_timestamp(DBusMessageIter *iter, 7321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 7331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 7348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 7361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &wpa_debug_timestamp, error); 7378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_show_keys - Get debug show keys 7431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 7441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 7451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 7461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugShowKeys" property. 7498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_show_keys(DBusMessageIter *iter, 7511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 7521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 7538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 7551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &wpa_debug_show_keys, error); 7568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_level - Set debug level 7611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 7621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 7631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 7641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugLevel" property. 7678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_level(DBusMessageIter *iter, 7691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 7708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_global *global = user_data; 7728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *str = NULL; 7738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i, val = -1; 7748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING, 7761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &str)) 7771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 7788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; debug_strings[i]; i++) 7808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(debug_strings[i], str) == 0) { 7818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val = i; 7828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 7838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (val < 0 || 7868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_set_debug_params(global, val, wpa_debug_timestamp, 7878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_show_keys)) { 7881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, "wrong debug " 7891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "level value"); 7901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 7918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 7948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_timestamp - Set debug timestamp 7991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 8001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 8011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 8021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 8038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 8048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugTimestamp" property. 8058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 8061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_timestamp(DBusMessageIter *iter, 8071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 8081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 8098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_global *global = user_data; 8118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t val; 8128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, 8141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &val)) 8151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 8168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_set_debug_params(global, wpa_debug_level, val ? 1 : 0, 8188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_show_keys); 8191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 8208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 8248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_show_keys - Set debug show keys 8251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 8261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 8271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 8281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 8298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 8308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugShowKeys" property. 8318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 8321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_show_keys(DBusMessageIter *iter, 8331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 8341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 8358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_global *global = user_data; 8378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t val; 8388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, 8401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &val)) 8411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 8428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_set_debug_params(global, wpa_debug_level, 8448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_timestamp, 8458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val ? 1 : 0); 8461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 8478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 8518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_interfaces - Request registered interfaces list 8521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 8531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 8541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 8551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 8568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 8578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Interfaces" property. Handles requests 8588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of registered interfaces objects 8598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * paths 8608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 8611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_interfaces(DBusMessageIter *iter, 8621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 8631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 8648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_global *global = user_data; 8668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 8678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char **paths; 8688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int i = 0, num = 0; 8691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success; 8708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) 8728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt num++; 8738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 87461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt paths = os_calloc(num, sizeof(char *)); 8758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!paths) { 8761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 8771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 8788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) 8818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt paths[i++] = wpa_s->dbus_new_path; 8828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, 8841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_OBJECT_PATH, 8851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt paths, num, error); 8868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths); 8881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 8898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 8938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_eap_methods - Request supported EAP methods list 8941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 8951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 8961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 8971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 8988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 8998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "EapMethods" property. Handles requests 9008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of strings with supported EAP methods 9018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 9021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_eap_methods(DBusMessageIter *iter, 9031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 9048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **eap_methods; 9068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t num_items = 0; 9071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success; 9088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eap_methods = eap_get_names_as_string_array(&num_items); 9108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!eap_methods) { 9111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 9121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 9138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, 9161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_STRING, 9171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt eap_methods, 9181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt num_items, error); 9198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (num_items) 9218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(eap_methods[--num_items]); 9228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(eap_methods); 9231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 9248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_type(DBusMessage *message, DBusMessageIter *var, 9288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **type, DBusMessage **reply) 9298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_STRING) { 9318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 9328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Type must be a string"); 9338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 9348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong Type value type. String required"); 9358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(var, type); 9388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 9398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ssids(DBusMessage *message, DBusMessageIter *var, 9438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params *params, 9448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage **reply) 9458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_ssid *ssids = params->ssids; 9478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t ssids_num = 0; 9488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *ssid; 9498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter array_iter, sub_array_iter; 9508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *val; 9518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int len; 9528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) { 9548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: ssids " 9558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "must be an array of arrays of bytes"); 9568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 9578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong SSIDs value type. Array of arrays of " 9588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "bytes required"); 9598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(var, &array_iter); 9638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY || 9658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE) 9668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 9678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: ssids " 9688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "must be an array of arrays of bytes"); 9698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 9708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong SSIDs value type. Array of arrays of " 9718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "bytes required"); 9728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY) 9768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 9778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssids_num >= WPAS_MAX_SCAN_SSIDS) { 9788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 9798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Too many ssids specified on scan dbus " 9808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "call"); 9818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 9828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Too many ssids specified. Specify " 9838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "at most four"); 9848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&array_iter, &sub_array_iter); 9888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len); 9908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 991c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt if (len > MAX_SSID_LEN) { 992c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt wpa_printf(MSG_DEBUG, 993c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt "wpas_dbus_handler_scan[dbus]: " 994c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt "SSID too long (len=%d max_len=%d)", 995c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt len, MAX_SSID_LEN); 996c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 997c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt message, "Invalid SSID: too long"); 998c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return -1; 999c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt } 1000c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 10018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (len != 0) { 10028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = os_malloc(len); 10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 10048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, 10058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpas_dbus_handler_scan[dbus]: " 10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "out of memory. Cannot allocate " 10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "memory for SSID"); 10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = dbus_message_new_error( 10098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, DBUS_ERROR_NO_MEMORY, NULL); 10108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(ssid, val, len); 10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Allow zero-length SSIDs */ 10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = NULL; 10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssids[ssids_num].ssid = ssid; 10198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssids[ssids_num].ssid_len = len; 10208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 10228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssids_num++; 10238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->num_ssids = ssids_num; 10268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 10278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ies(DBusMessage *message, DBusMessageIter *var, 10318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params *params, 10328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage **reply) 10338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *ies = NULL, *nies; 10358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ies_len = 0; 10368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter array_iter, sub_array_iter; 10378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *val; 10388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int len; 10398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) { 10418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: ies must " 10428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "be an array of arrays of bytes"); 10438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong IEs value type. Array of arrays of " 10458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "bytes required"); 10468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(var, &array_iter); 10508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY || 10528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE) 10538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 10548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: ies must " 10558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "be an array of arrays of bytes"); 10568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong IEs value type. Array required"); 10588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY) 10628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 10638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&array_iter, &sub_array_iter); 10648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len); 10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (len == 0) { 10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 10688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 10698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nies = os_realloc(ies, ies_len + len); 10728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nies == NULL) { 10738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 10748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "out of memory. Cannot allocate memory for " 10758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "IE"); 10768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ies); 10778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = dbus_message_new_error( 10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, DBUS_ERROR_NO_MEMORY, NULL); 10798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ies = nies; 10828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(ies + ies_len, val, len); 10838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ies_len += len; 10848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 10868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->extra_ies = ies; 10898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->extra_ies_len = ies_len; 10908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 10918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_channels(DBusMessage *message, 10958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter *var, 10968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params *params, 10978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage **reply) 10988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter array_iter, sub_array_iter; 11008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int *freqs = NULL, *nfreqs; 11018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int freqs_num = 0; 11028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) { 11048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 11058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Channels must be an array of structs"); 11068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong Channels value type. Array of structs " 11088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "required"); 11098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(var, &array_iter); 11138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_STRUCT) { 11158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, 11168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpas_dbus_handler_scan[dbus]: Channels must be an " 11178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "array of structs"); 11188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong Channels value type. Array of structs " 11208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "required"); 11218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_STRUCT) 11258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 11268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int freq, width; 11278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&array_iter, &sub_array_iter); 11298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&sub_array_iter) != 11318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_UINT32) { 11328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 11338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Channel must by specified by struct of " 11348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "two UINT32s %c", 11358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_arg_type( 11368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &sub_array_iter)); 11378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong Channel struct. Two UINT32s " 11398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "required"); 11408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 11418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&sub_array_iter, &freq); 11448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_next(&sub_array_iter) || 11468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_arg_type(&sub_array_iter) != 11478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_UINT32) { 11488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 11498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Channel must by specified by struct of " 11508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "two UINT32s"); 11518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, 11538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Wrong Channel struct. Two UINT32s required"); 11548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 11558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&sub_array_iter, &width); 11598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define FREQS_ALLOC_CHUNK 32 11618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (freqs_num % FREQS_ALLOC_CHUNK == 0) { 116261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt nfreqs = os_realloc_array( 116361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt freqs, freqs_num + FREQS_ALLOC_CHUNK, 116461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt sizeof(int)); 11658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nfreqs == NULL) 11668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 11678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs = nfreqs; 11688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (freqs == NULL) { 11708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 11718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "out of memory. can't allocate memory for " 11728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "freqs"); 11738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = dbus_message_new_error( 11748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, DBUS_ERROR_NO_MEMORY, NULL); 11758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs[freqs_num] = freq; 11798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs_num++; 11818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 118461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt nfreqs = os_realloc_array(freqs, freqs_num + 1, sizeof(int)); 11858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nfreqs == NULL) 11868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 11878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs = nfreqs; 11888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (freqs == NULL) { 11898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 11908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "out of memory. Can't allocate memory for freqs"); 11918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = dbus_message_new_error( 11928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, DBUS_ERROR_NO_MEMORY, NULL); 11938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs[freqs_num] = 0; 11968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->freqs = freqs; 11988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 11998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 12008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 12038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_scan - Request a wireless scan on an interface 12048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 12058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 12068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL indicating success or DBus error message on failure 12078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 12088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Scan" method call of a network device. Requests 12098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * that wpa_supplicant perform a wireless scan as soon as possible 12108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * on a particular wireless interface. 12118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 12128d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_scan(DBusMessage *message, 12138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 12148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 12158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 12168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, dict_iter, entry_iter, variant_iter; 12178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *key = NULL, *type = NULL; 12188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params params; 12198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t i; 12208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(¶ms, 0, sizeof(params)); 12228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 12248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&iter, &dict_iter); 12268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dbus_message_iter_get_arg_type(&dict_iter) == 12288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_DICT_ENTRY) { 12298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&dict_iter, &entry_iter); 12308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&entry_iter, &key); 12318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&entry_iter); 12328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&entry_iter, &variant_iter); 12338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(key, "Type") == 0) { 12358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_type(message, &variant_iter, 12368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &type, &reply) < 0) 12378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 12388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(key, "SSIDs") == 0) { 12398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_ssids(message, &variant_iter, 12408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ¶ms, &reply) < 0) 12418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 12428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(key, "IEs") == 0) { 12438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_ies(message, &variant_iter, 12448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ¶ms, &reply) < 0) 12458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 12468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(key, "Channels") == 0) { 12478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_channels(message, &variant_iter, 12488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ¶ms, &reply) < 0) 12498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 12508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 12518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 12528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Unknown argument %s", key); 12538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, key); 12548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 12558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&dict_iter); 12588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!type) { 12618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 12628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Scan type not specified"); 12638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, key); 12648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 12658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!os_strcmp(type, "passive")) { 12688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (params.num_ssids || params.extra_ies_len) { 12698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 12708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "SSIDs or IEs specified for passive scan."); 12718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args( 12728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "You can specify only Channels in " 12738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "passive scan"); 12748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 12758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (params.freqs && params.freqs[0]) { 12768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_trigger_scan(wpa_s, ¶ms); 12778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 12788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->scan_req = 2; 12798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_req_scan(wpa_s, 0, 0); 12808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (!os_strcmp(type, "active")) { 12828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!params.num_ssids) { 12838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Add wildcard ssid */ 12848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.num_ssids++; 12858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 128604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN 128704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt autoscan_deinit(wpa_s); 128804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */ 12898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_trigger_scan(wpa_s, ¶ms); 12908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 12918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 12928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Unknown scan type: %s", type); 12938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, 12948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Wrong scan type"); 12958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 12968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 12998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < WPAS_MAX_SCAN_SSIDS; i++) 13008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free((u8 *) params.ssids[i].ssid); 13018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free((u8 *) params.extra_ies); 13028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(params.freqs); 13038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 13048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 13058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 13088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_disconnect - Terminate the current connection 13098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 13108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 13118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NotConnected DBus error message if already not connected 13128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or NULL otherwise. 13138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 13148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Disconnect" method call of network interface. 13158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 13168d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_disconnect(DBusMessage *message, 13178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 13188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 13198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->current_ssid != NULL) { 13208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->disconnected = 1; 13218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_deauthenticate(wpa_s, 13228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WLAN_REASON_DEAUTH_LEAVING); 13238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 13258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_NOT_CONNECTED, 13288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "This interface is not connected"); 13298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 13308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 13338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_add_network - Add a new configured network 13348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 13358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 13368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing the object path of the new network 13378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 13388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "AddNetwork" method call of a network interface. 13398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 13408d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_network(DBusMessage *message, 13418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 13428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 13438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 13448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter; 13458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid = NULL; 13468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *path = path_buf; 13471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError error; 13488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 13508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = wpa_config_add_network(wpa_s->conf); 13528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 13538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "wpas_dbus_handler_add_network[dbus]: " 13548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "can't add new interface."); 13558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_unknown_error( 13568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, 13578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa_supplicant could not add " 13588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "a network on this interface."); 13598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 13608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_added(wpa_s, ssid); 13628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid->disabled = 1; 13638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_set_network_defaults(ssid); 13648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_error_init(&error); 13661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!set_network_properties(wpa_s, ssid, &iter, &error)) { 13678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_add_network[dbus]:" 13688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "control interface couldn't set network " 13698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "properties"); 13701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_reply_new_from_error(message, &error, 13711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_ERROR_INVALID_ARGS, 13721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "Failed to add network"); 13731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_error_free(&error); 13748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 13758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Construct the object path for this network. */ 13788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX, 13798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d", 13808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, ssid->id); 13818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 13838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply == NULL) { 13848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 13858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 13868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 13878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path, 13898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID)) { 13908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 13918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 13928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 13938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 13948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 13978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr: 13998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid) { 14008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_removed(wpa_s, ssid); 14018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_remove_network(wpa_s->conf, ssid->id); 14028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 14048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 14058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 140861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * wpas_dbus_handler_reassociate - Reassociate to current AP 140961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * @message: Pointer to incoming dbus message 141061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 141161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * Returns: NotConnected DBus error message if not connected 141261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * or NULL otherwise. 141361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * 141461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * Handler function for "Reassociate" method call of network interface. 141561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt */ 141661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtDBusMessage * wpas_dbus_handler_reassociate(DBusMessage *message, 141761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt struct wpa_supplicant *wpa_s) 141861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 141961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (wpa_s->current_ssid != NULL) { 142061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_s->normal_scans = 0; 142161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_supplicant_reinit_autoscan(wpa_s); 142261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_s->disconnected = 0; 142361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_s->reassociate = 1; 142461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_supplicant_req_scan(wpa_s, 0, 0); 142561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 142661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return NULL; 142761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 142861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 142961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_NOT_CONNECTED, 143061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "This interface is not connected"); 143161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 143261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 143361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 143461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt/** 14358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_network - Remove a configured network 14368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 14378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 14388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure 14398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 14408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveNetwork" method call of a network interface. 14418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 14428d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_network(DBusMessage *message, 14438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 14448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 14458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 14468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *op; 14478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *iface = NULL, *net_id = NULL; 14488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int id; 14498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 14508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op, 14528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 14538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Extract the network ID and ensure the network */ 14558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* is actually a child of this interface */ 145675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen iface = wpas_dbus_new_decompose_object_path(op, 0, &net_id, NULL); 14578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (iface == NULL || os_strcmp(iface, wpa_s->dbus_new_path) != 0) { 14588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 14598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 14608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt id = strtoul(net_id, NULL, 10); 14638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (errno == EINVAL) { 14648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 14658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 14668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 14698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 14708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_network_unknown(message); 14718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 14728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_removed(wpa_s, ssid); 14758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_remove_network(wpa_s->conf, id) < 0) { 14778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, 14788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpas_dbus_handler_remove_network[dbus]: " 14798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "error occurred when removing network %d", id); 14808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_unknown_error( 14818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "error removing the specified network on " 14828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "this interface."); 14838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 14848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == wpa_s->current_ssid) 14878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_deauthenticate(wpa_s, 14888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WLAN_REASON_DEAUTH_LEAVING); 14898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 14918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(iface); 14928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(net_id); 14938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 14948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 14958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void remove_network(void *arg, struct wpa_ssid *ssid) 14988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 14998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = arg; 15008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_removed(wpa_s, ssid); 15028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_remove_network(wpa_s->conf, ssid->id) < 0) { 15048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, 15058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpas_dbus_handler_remove_all_networks[dbus]: " 15068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "error occurred when removing network %d", 15078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid->id); 15088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 15098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == wpa_s->current_ssid) 15128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_disassociate(wpa_s, WLAN_REASON_DEAUTH_LEAVING); 15138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 15148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 15178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_all_networks - Remove all configured networks 15188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 15198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 15208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure 15218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 15228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveAllNetworks" method call of a network interface. 15238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 15248d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_all_networks( 15258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *message, struct wpa_supplicant *wpa_s) 15268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 15278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* NB: could check for failure and return an error */ 15288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_foreach_network(wpa_s->conf, remove_network, wpa_s); 15298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 15308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 15318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 15348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_select_network - Attempt association with a network 15358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 15368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 15378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure 15388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 15398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "SelectNetwork" method call of network interface. 15408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 15418d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_select_network(DBusMessage *message, 15428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 15438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 15448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 15458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *op; 15468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *iface = NULL, *net_id = NULL; 15478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int id; 15488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 15498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op, 15518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 15528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Extract the network ID and ensure the network */ 15548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* is actually a child of this interface */ 155575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen iface = wpas_dbus_new_decompose_object_path(op, 0, &net_id, NULL); 15568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (iface == NULL || os_strcmp(iface, wpa_s->dbus_new_path) != 0) { 15578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 15588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 15598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt id = strtoul(net_id, NULL, 10); 15628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (errno == EINVAL) { 15638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 15648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 15658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 15688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 15698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_network_unknown(message); 15708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 15718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Finally, associate with the network */ 15748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_select_network(wpa_s, ssid); 15758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 15778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(iface); 15788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(net_id); 15798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 15808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 15818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 15841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * wpas_dbus_handler_network_reply - Reply to a NetworkRequest signal 15851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @message: Pointer to incoming dbus message 15861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 15871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: NULL on success or dbus error on failure 15881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * 15891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Handler function for "NetworkReply" method call of network interface. 15901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt */ 15911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry ShmidtDBusMessage * wpas_dbus_handler_network_reply(DBusMessage *message, 15921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s) 15931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 15941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef IEEE8021X_EAPOL 15951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessage *reply = NULL; 15961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const char *op, *field, *value; 15971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char *iface = NULL, *net_id = NULL; 15981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int id; 15991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_ssid *ssid; 16001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 16011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_get_args(message, NULL, 16021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_OBJECT_PATH, &op, 16031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_STRING, &field, 16041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_STRING, &value, 16051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_INVALID)) 16061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_error_invalid_args(message, NULL); 16071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 16081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Extract the network ID and ensure the network */ 16091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* is actually a child of this interface */ 16101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt iface = wpas_dbus_new_decompose_object_path(op, 0, &net_id, NULL); 16111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (iface == NULL || os_strcmp(iface, wpa_s->dbus_new_path) != 0) { 16121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 16131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto out; 16141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 16151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 16161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt id = strtoul(net_id, NULL, 10); 16171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (errno == EINVAL) { 16181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_error_invalid_args(message, net_id); 16191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto out; 16201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 16211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 16221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 16231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (ssid == NULL) { 16241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_error_network_unknown(message); 16251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto out; 16261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 16271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 16281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (wpa_supplicant_ctrl_iface_ctrl_rsp_handle(wpa_s, ssid, 16291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt field, value) < 0) 16301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_error_invalid_args(message, field); 16311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt else { 16321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Tell EAP to retry immediately */ 16331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt eapol_sm_notify_ctrl_response(wpa_s->eapol); 16341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 16351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 16361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtout: 16371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(iface); 16381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(net_id); 16391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return reply; 16401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#else /* IEEE8021X_EAPOL */ 16411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: 802.1X not included"); 16421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_error_unknown_error(message, "802.1X not included"); 16431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* IEEE8021X_EAPOL */ 16441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 16451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 16461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 16471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/** 16488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_add_blob - Store named binary blob (ie, for certificates) 16498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 16508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 16518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing an error on failure or NULL on success 16528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 16538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally store a binary blobs. 16548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 16558d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_blob(DBusMessage *message, 16568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 16578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 16588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 16598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, array_iter; 16608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *blob_name; 16628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *blob_data; 16638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int blob_len; 16648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_config_blob *blob = NULL; 16658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 16678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&iter, &blob_name); 16688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_get_blob(wpa_s->conf, blob_name)) { 16708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, 16718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPAS_DBUS_ERROR_BLOB_EXISTS, 16728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 16738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&iter); 16768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&iter, &array_iter); 16778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_fixed_array(&array_iter, &blob_data, &blob_len); 16798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = os_zalloc(sizeof(*blob)); 16818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!blob) { 16828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 16838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 16848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 16858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->data = os_malloc(blob_len); 16888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!blob->data) { 16898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 16908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 16918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 16928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(blob->data, blob_data, blob_len); 16948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->len = blob_len; 16968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->name = os_strdup(blob_name); 16978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!blob->name) { 16988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 16998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 17008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 17018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_set_blob(wpa_s->conf, blob); 17048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_blob_added(wpa_s, blob->name); 17058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 17078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr: 17098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (blob) { 17108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(blob->name); 17118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(blob->data); 17128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(blob); 17138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 17158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 17198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_blob - Get named binary blob (ie, for certificates) 17208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 17218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 17228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing array of bytes (blob) 17238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 17248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Gets one wpa_supplicant's binary blobs. 17258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 17268d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_blob(DBusMessage *message, 17278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 17288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 17308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, array_iter; 17318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *blob_name; 17338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct wpa_config_blob *blob; 17348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name, 17368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 17378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = wpa_config_get_blob(wpa_s->conf, blob_name); 17398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!blob) { 17408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, 17418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPAS_DBUS_ERROR_BLOB_UNKNOWN, 17428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Blob id not set"); 17438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 17468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!reply) { 17478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 17488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 17498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 17508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init_append(reply, &iter); 17538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, 17558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_BYTE_AS_STRING, 17568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &array_iter)) { 17578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 17588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 17598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 17608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 17618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_append_fixed_array(&array_iter, DBUS_TYPE_BYTE, 17648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &(blob->data), blob->len)) { 17658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 17668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 17678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 17688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 17698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_close_container(&iter, &array_iter)) { 17728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 17738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 17748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 17758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 17768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 17798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 17808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 17848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_remove_handler_remove_blob - Remove named binary blob 17858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 17868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 17878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error 17888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 17898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally remove a binary blobs. 17908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 17918d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_blob(DBusMessage *message, 17928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 17938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 17958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *blob_name; 17968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name, 17988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 17998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_remove_blob(wpa_s->conf, blob_name)) { 18018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, 18028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPAS_DBUS_ERROR_BLOB_UNKNOWN, 18038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Blob id not set"); 18048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_blob_removed(wpa_s, blob_name); 18068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 18088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 18108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 18128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_flush_bss - Flush the BSS cache 18138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 18148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 18158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL 18168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 18178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "FlushBSS" method call of network interface. 18188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 18198d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_flush_bss(DBusMessage *message, 18208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 18218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t age; 18238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_UINT32, &age, 18258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 18268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (age == 0) 18288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_bss_flush(wpa_s); 18298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 18308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_bss_flush_by_age(wpa_s, age); 18318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 18338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 18348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 183604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN 183704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 183804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_handler_autoscan - Set autoscan parameters for the interface 183904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @message: Pointer to incoming dbus message 184004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 184104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: NULL 184204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 184304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Handler function for "AutoScan" method call of network interface. 184404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 184504949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_autoscan(DBusMessage *message, 184604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_supplicant *wpa_s) 184704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 184804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessage *reply = NULL; 184904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt enum wpa_states state = wpa_s->wpa_state; 185004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *arg; 185104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 185204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &arg, 185304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBUS_TYPE_INVALID); 185404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 185504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (arg != NULL && os_strlen(arg) > 0) { 185604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *tmp; 185704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt tmp = os_strdup(arg); 185804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (tmp == NULL) { 185904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt reply = dbus_message_new_error(message, 186004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBUS_ERROR_NO_MEMORY, 186104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt NULL); 186204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else { 186304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(wpa_s->conf->autoscan); 186404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->conf->autoscan = tmp; 186504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (state == WPA_DISCONNECTED || state == WPA_INACTIVE) 186604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt autoscan_init(wpa_s, 1); 186704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt else if (state == WPA_SCANNING) 186804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_supplicant_reinit_autoscan(wpa_s); 186904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 187004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (arg != NULL && os_strlen(arg) == 0) { 187104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(wpa_s->conf->autoscan); 187204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->conf->autoscan = NULL; 187304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt autoscan_deinit(wpa_s); 187404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else 187504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt reply = dbus_message_new_error(message, 187604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBUS_ERROR_INVALID_ARGS, 187704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt NULL); 187804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 187904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return reply; 188004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 188104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */ 188204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 188304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 18848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 18858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_capabilities - Return interface capabilities 18861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 18871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 18881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 18891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 18908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 18918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Capabilities" property of an interface. 18928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 18931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_capabilities(DBusMessageIter *iter, 18941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 18958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 18978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_capa capa; 18988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 18991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter iter_dict, iter_dict_entry, iter_dict_val, iter_array, 19008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt variant_iter; 19018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *scans[] = { "active", "passive", "ssid" }; 19028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 19048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "a{sv}", &variant_iter)) 19058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict)) 19088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = wpa_drv_get_capa(wpa_s, &capa); 19118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** pairwise cipher */ 19138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 19148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = {"ccmp", "tkip", "none"}; 19158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 19168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "Pairwise", args, 19178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(args) / sizeof(char*))) 19188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 19208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Pairwise", 19218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 19228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 19238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 19248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) { 19278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 19288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "ccmp")) 19298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 193261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_GCMP) { 193361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 193461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt &iter_array, "gcmp")) 193561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto nomem; 193661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 193761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 19388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) { 19398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 19408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "tkip")) 19418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) { 19458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 19468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "none")) 19478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_end_string_array(&iter_dict, 19518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 19528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 19538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 19548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** group cipher */ 19588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 19598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { 19608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "ccmp", "tkip", "wep104", "wep40" 19618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }; 19628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 19638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "Group", args, 19648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(args) / sizeof(char*))) 19658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 19678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Group", 19688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 19698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 19708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 19718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) { 19748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 19758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "ccmp")) 19768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 197961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_GCMP) { 198061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 198161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt &iter_array, "gcmp")) 198261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto nomem; 198361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 198461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 19858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) { 19868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 19878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "tkip")) 19888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_WEP104) { 19928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 19938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wep104")) 19948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_WEP40) { 19988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 19998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wep40")) 20008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_end_string_array(&iter_dict, 20048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 20058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 20068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 20078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** key management */ 20118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 20128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { 20138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa-psk", "wpa-eap", "ieee8021x", "wpa-none", 20148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 20158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wps", 20168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 20178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "none" 20188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }; 20198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 20208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "KeyMgmt", args, 20218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(args) / sizeof(char*))) 20228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 20248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "KeyMgmt", 20258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 20268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 20278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 20288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element(&iter_array, 20318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "none")) 20328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element(&iter_array, 20358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "ieee8021x")) 20368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA | 20398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2)) { 20408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 20418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-eap")) 20428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_FT) 20458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 20468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-ft-eap")) 20478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */ 20508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 20518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 20528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-eap-sha256")) 20538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 20558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK | 20588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) { 20598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 20608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-psk")) 20618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_FT_PSK) 20648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 20658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-ft-psk")) 20668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */ 20698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 20708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 20718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-psk-sha256")) 20728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 20748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) { 20778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 20788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-none")) 20798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 20848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element(&iter_array, 20858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wps")) 20868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 20888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_end_string_array(&iter_dict, 20908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 20918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 20928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 20938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** WPA protocol */ 20978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 20988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { "rsn", "wpa" }; 20998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 21008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "Protocol", args, 21018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(args) / sizeof(char*))) 21028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 21038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 21048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Protocol", 21058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 21068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 21078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 21088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 21098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA2 | 21118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) { 21128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 21138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "rsn")) 21148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 21158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA | 21188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK)) { 21198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 21208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa")) 21218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 21228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_end_string_array(&iter_dict, 21258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 21268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 21278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 21288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 21298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** auth alg */ 21328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 21338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { "open", "shared", "leap" }; 21348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 21358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "AuthAlg", args, 21368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(args) / sizeof(char*))) 21378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 21388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 21398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "AuthAlg", 21408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 21418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 21428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 21438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 21448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.auth & (WPA_DRIVER_AUTH_OPEN)) { 21468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 21478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "open")) 21488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 21498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.auth & (WPA_DRIVER_AUTH_SHARED)) { 21528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 21538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "shared")) 21548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 21558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.auth & (WPA_DRIVER_AUTH_LEAP)) { 21588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 21598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "leap")) 21608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 21618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_end_string_array(&iter_dict, 21648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 21658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 21668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 21678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 21688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** Scan */ 21718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array(&iter_dict, "Scan", scans, 21728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(scans) / sizeof(char *))) 21738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 21748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** Modes */ 217675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Modes", 217775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_entry, 217875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_val, 217975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_array)) 21808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 21818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 218275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!wpa_dbus_dict_string_array_add_element( 218375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_array, "infrastructure")) 218475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen goto nomem; 218575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen 218675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!wpa_dbus_dict_string_array_add_element( 218775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_array, "ad-hoc")) 218875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen goto nomem; 218975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen 219075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (res >= 0) { 219175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (capa.flags & (WPA_DRIVER_FLAGS_AP)) { 219275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!wpa_dbus_dict_string_array_add_element( 219375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_array, "ap")) 219475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen goto nomem; 219575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen } 219675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen 219775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (capa.flags & (WPA_DRIVER_FLAGS_P2P_CAPABLE)) { 219875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!wpa_dbus_dict_string_array_add_element( 219975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_array, "p2p")) 220075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen goto nomem; 220175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen } 220275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen } 220375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen 220475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!wpa_dbus_dict_end_string_array(&iter_dict, 220575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_entry, 220675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_val, 220775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_array)) 220875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen goto nomem; 220975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen /***** Modes end */ 221075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen 22111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (res >= 0) { 22121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_int32_t max_scan_ssid = capa.max_scan_ssids; 22131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 22141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpa_dbus_dict_append_int32(&iter_dict, "MaxScanSSID", 22151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt max_scan_ssid)) 22161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto nomem; 22171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 22181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 22198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict)) 22208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 22211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_close_container(iter, &variant_iter)) 22228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 22238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 22258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem: 22271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 22281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 22298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 22308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 22338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_state - Get interface state 22341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 22351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 22361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 22371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 22388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 22398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "State" property. 22408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 22411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_state(DBusMessageIter *iter, DBusError *error, 22421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 22438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 22441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 22458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *str_state; 22468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *state_ls, *tmp; 22471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 22488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt str_state = wpa_supplicant_state_txt(wpa_s->wpa_state); 22508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* make state string lowercase to fit new DBus API convention 22528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 22538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt state_ls = tmp = os_strdup(str_state); 22548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!tmp) { 22551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 22561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 22578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*tmp) { 22598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *tmp = tolower(*tmp); 22608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tmp++; 22618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 22641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &state_ls, error); 22658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(state_ls); 22678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 22698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 22708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 22738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_get_scanning - Get interface scanning state 22741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 22751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 22761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 22771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 22788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 22798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "scanning" property. 22808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 22811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_scanning(DBusMessageIter *iter, DBusError *error, 22821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 22838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 22841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 22858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t scanning = wpa_s->scanning ? TRUE : FALSE; 22861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 22871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 22881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &scanning, error); 22898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 22908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 22938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ap_scan - Control roaming mode 22941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 22951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 22961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 22971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 22988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 22998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "ApScan" property. 23008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 23011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_ap_scan(DBusMessageIter *iter, DBusError *error, 23021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 23038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 23041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 23058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t ap_scan = wpa_s->conf->ap_scan; 23061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 23071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, 23081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &ap_scan, error); 23098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 23108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 23138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_ap_scan - Control roaming mode 23141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 23151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 23161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 23171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 23188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 23198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "ApScan" property. 23208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 23211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_ap_scan(DBusMessageIter *iter, DBusError *error, 23221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 23238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 23241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 23258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t ap_scan; 23268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32, 23281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &ap_scan)) 23291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 23308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_set_ap_scan(wpa_s, ap_scan)) { 23321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 23331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "ap_scan must be 0, 1, or 2"); 23341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 23358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 23361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 23378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 23388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 2341c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * wpas_dbus_getter_fast_reauth - Control fast 2342c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * reauthentication (TLS session resumption) 2343c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 2344c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @error: Location to store error on failure 2345c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @user_data: Function specific data 2346c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Returns: TRUE on success, FALSE on failure 2347c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * 2348c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Getter function for "FastReauth" property. 2349c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt */ 2350c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidtdbus_bool_t wpas_dbus_getter_fast_reauth(DBusMessageIter *iter, 2351c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt DBusError *error, 2352c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt void *user_data) 2353c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt{ 2354c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 2355c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt dbus_bool_t fast_reauth = wpa_s->conf->fast_reauth ? TRUE : FALSE; 2356c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2357c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 2358c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt &fast_reauth, error); 2359c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt} 2360c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2361c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2362c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt/** 2363c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * wpas_dbus_setter_fast_reauth - Control fast 2364c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * reauthentication (TLS session resumption) 2365c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 2366c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @error: Location to store error on failure 2367c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @user_data: Function specific data 2368c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Returns: TRUE on success, FALSE on failure 2369c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * 2370c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Setter function for "FastReauth" property. 2371c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt */ 2372c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidtdbus_bool_t wpas_dbus_setter_fast_reauth(DBusMessageIter *iter, 2373c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt DBusError *error, 2374c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt void *user_data) 2375c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt{ 2376c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 2377c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt dbus_bool_t fast_reauth; 2378c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2379c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, 2380c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt &fast_reauth)) 2381c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return FALSE; 2382c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2383c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt wpa_s->conf->fast_reauth = fast_reauth; 2384c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return TRUE; 2385c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt} 2386c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2387c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2388c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt/** 238904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_getter_disconnect_reason - Get most recent reason for disconnect 239004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 239104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure 239204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data 239304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 239404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 239504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Getter for "DisconnectReason" property. The reason is negative if it is 239604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * locally generated. 239704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 239804949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_getter_disconnect_reason(DBusMessageIter *iter, 239904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusError *error, 240004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt void *user_data) 240104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 240204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 240304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_int32_t reason = wpa_s->disconnect_reason; 240404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32, 240504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt &reason, error); 240604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 240704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 240804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 240904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 24108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_age - Get BSS entry expiration age 24111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 24121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 24131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 24141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 24158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 24168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "BSSExpireAge" property. 24178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 24181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_expire_age(DBusMessageIter *iter, 24191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 24201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 24218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 24221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 24238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t expire_age = wpa_s->conf->bss_expiration_age; 24241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 24251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, 24261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &expire_age, error); 24278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 24288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 24318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_age - Control BSS entry expiration age 24321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 24331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 24341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 24351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 24368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 24378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "BSSExpireAge" property. 24388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 24391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_bss_expire_age(DBusMessageIter *iter, 24401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 24411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 24428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 24431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 24448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t expire_age; 24458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32, 24471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &expire_age)) 24481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 24498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_set_bss_expiration_age(wpa_s, expire_age)) { 24511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 24521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "BSSExpireAge must be >= 10"); 24531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 24548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 24568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 24578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 24608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_count - Get BSS entry expiration scan count 24611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 24621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 24631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 24641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 24658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 24668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "BSSExpireCount" property. 24678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 24681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_expire_count(DBusMessageIter *iter, 24691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 24701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 24718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 24721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 247361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt dbus_uint32_t expire_count = wpa_s->conf->bss_expiration_scan_count; 24741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 24751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, 24761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &expire_count, error); 24778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 24788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 24818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_count - Control BSS entry expiration scan count 24821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 24831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 24841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 24851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 24868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 24878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "BSSExpireCount" property. 24888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 24891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_bss_expire_count(DBusMessageIter *iter, 24901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 24911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 24928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 24931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 24948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t expire_count; 24958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32, 24971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &expire_count)) 24981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 24998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_set_bss_expiration_count(wpa_s, expire_count)) { 25011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 25021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "BSSExpireCount must be > 0"); 25031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 25048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 25068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 25078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 25108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_country - Control country code 25111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 25121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 25131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 25141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 25158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 25168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "Country" property. 25178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 25181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_country(DBusMessageIter *iter, DBusError *error, 25191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 25208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 25211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 25228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char country[3]; 25238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *str = country; 25248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt country[0] = wpa_s->conf->country[0]; 25268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt country[1] = wpa_s->conf->country[1]; 25278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt country[2] = '\0'; 25288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 25301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &str, error); 25318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 25328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 25358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_country - Control country code 25361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 25371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 25381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 25391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 25408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 25418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "Country" property. 25428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 25431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_country(DBusMessageIter *iter, DBusError *error, 25441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 25458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 25461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 25478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *country; 25488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING, 25501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &country)) 25511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 25528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!country[0] || !country[1]) { 25541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 25551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "invalid country code"); 25561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 25571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 25588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->drv_priv != NULL && wpa_drv_set_country(wpa_s, country)) { 25608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "Failed to set country"); 25611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 25621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "failed to set country code"); 25631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 25648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->conf->country[0] = country[0]; 25678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->conf->country[1] = country[1]; 25681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 25698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 25708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 257304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_getter_scan_interval - Get scan interval 257404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 257504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure 257604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data 257704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 257804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 257904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Getter function for "ScanInterval" property. 258004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 258104949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_getter_scan_interval(DBusMessageIter *iter, 258204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusError *error, 258304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt void *user_data) 258404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 258504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 258604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_int32_t scan_interval = wpa_s->scan_interval; 258704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 258804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32, 258904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt &scan_interval, error); 259004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 259104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 259204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 259304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 259404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_setter_scan_interval - Control scan interval 259504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 259604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure 259704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data 259804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 259904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 260004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Setter function for "ScanInterval" property. 260104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 260204949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_setter_scan_interval(DBusMessageIter *iter, 260304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusError *error, 260404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt void *user_data) 260504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 260604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 260704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_int32_t scan_interval; 260804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 260904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_INT32, 261004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt &scan_interval)) 261104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 261204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 261304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_supplicant_set_scan_interval(wpa_s, scan_interval)) { 261404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 261504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "scan_interval must be >= 0"); 261604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 261704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 261804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return TRUE; 261904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 262004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 262104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 262204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 26238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ifname - Get interface name 26241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 26251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 26261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 26271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 26288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 26298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Ifname" property. 26308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 26311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_ifname(DBusMessageIter *iter, DBusError *error, 26321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 26338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 26341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 26358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *ifname = wpa_s->ifname; 26361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 26371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 26381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &ifname, error); 26398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 26408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 26438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_driver - Get interface name 26441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 26451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 26461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 26471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 26488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 26498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Driver" property. 26508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 26511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_driver(DBusMessageIter *iter, DBusError *error, 26521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 26538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 26541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 26558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *driver; 26568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->driver == NULL || wpa_s->driver->name == NULL) { 26588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_getter_driver[dbus]: " 26598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa_s has no driver set"); 26601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, "%s: no driver set", 26611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt __func__); 26621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 26638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt driver = wpa_s->driver->name; 26661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 26671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &driver, error); 26688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 26698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 26728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_bss - Get current bss object path 26731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 26741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 26751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 26761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 26778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 26788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentBSS" property. 26798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 26801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_bss(DBusMessageIter *iter, 26811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 26821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 26838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 26841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 26858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *bss_obj_path = path_buf; 26868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->current_bss) 26888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, 26898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u", 26908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, wpa_s->current_bss->id); 26918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 26928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/"); 26938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_OBJECT_PATH, 26951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &bss_obj_path, error); 26968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 26978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 27008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_network - Get current network object path 27011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 27021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 27031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 27041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 27058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 27068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentNetwork" property. 27078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 27081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_network(DBusMessageIter *iter, 27091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 27101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 27118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 27121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 27138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *net_obj_path = path_buf; 27148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->current_ssid) 27168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, 27178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u", 27188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, wpa_s->current_ssid->id); 27198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 27208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/"); 27218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_OBJECT_PATH, 27231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &net_obj_path, error); 27248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 27288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_auth_mode - Get current authentication type 27291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 27301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 27311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 27321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 27338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 27348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentAuthMode" property. 27358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 27361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_auth_mode(DBusMessageIter *iter, 27371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 27381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 27398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 27401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 27418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *eap_mode; 27428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *auth_mode; 27438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char eap_mode_buf[WPAS_DBUS_AUTH_MODE_MAX]; 27448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->wpa_state != WPA_COMPLETED) { 27468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt auth_mode = "INACTIVE"; 27478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X || 27488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) { 27498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eap_mode = wpa_supplicant_get_eap_mode(wpa_s); 27508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(eap_mode_buf, WPAS_DBUS_AUTH_MODE_MAX, 27518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "EAP-%s", eap_mode); 27528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt auth_mode = eap_mode_buf; 27538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 27558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt auth_mode = wpa_key_mgmt_txt(wpa_s->key_mgmt, 27568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->current_ssid->proto); 27578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 27588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 27601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &auth_mode, error); 27618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 27658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bridge_ifname - Get interface name 27661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 27671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 27681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 27691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 27708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 27718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BridgeIfname" property. 27728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 27731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bridge_ifname(DBusMessageIter *iter, 27741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 27751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 27768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 27771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 27781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const char *bridge_ifname = wpa_s->bridge_ifname; 27791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 27801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &bridge_ifname, error); 27818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 27858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bsss - Get array of BSSs objects 27861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 27871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 27881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 27891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 27908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 27918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSs" property. 27928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 27931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bsss(DBusMessageIter *iter, DBusError *error, 27941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 27958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 27961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 27978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_bss *bss; 27988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **paths; 27998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int i = 0; 28001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 28018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 280261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt paths = os_calloc(wpa_s->num_bss, sizeof(char *)); 28038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!paths) { 28041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 28051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 28068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 28078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Loop through scan results and append each result's object path */ 28098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dl_list_for_each(bss, &wpa_s->bss_id, struct wpa_bss, list_id) { 28108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX); 28118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (paths[i] == NULL) { 28121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, 28131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "no memory"); 28148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 28158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 28168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Construct the object path for this BSS. */ 28178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX, 28188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u", 28198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, bss->id); 28208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 28218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, 28231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_OBJECT_PATH, 28241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt paths, wpa_s->num_bss, 28251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 28268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 28288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (i) 28298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths[--i]); 28308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths); 28311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 28328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 28338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 28368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_networks - Get array of networks objects 28371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 28381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 28391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 28401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 28418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 28428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Networks" property. 28438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 28441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_networks(DBusMessageIter *iter, DBusError *error, 28451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 28468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 28471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 28488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 28498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **paths; 28508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int i = 0, num = 0; 28511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 28528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->conf == NULL) { 28541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_ERROR, "%s[dbus]: An error occurred getting " 28551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "networks list.", __func__); 28561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, "%s: an error " 28571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "occurred getting the networks list", __func__); 28581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 28598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 28608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) 286275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!network_is_persistent_group(ssid)) 286375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen num++; 28648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 286561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt paths = os_calloc(num, sizeof(char *)); 28668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!paths) { 28671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_NO_MEMORY, "no memory"); 28681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 28698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 28708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Loop through configured networks and append object path of each */ 28728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) { 287375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (network_is_persistent_group(ssid)) 287475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen continue; 28758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX); 28768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (paths[i] == NULL) { 28771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_NO_MEMORY, "no memory"); 28788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 28798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 28808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Construct the object path for this network. */ 28828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX, 28838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d", 28848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, ssid->id); 28858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 28868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, 28881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_OBJECT_PATH, 28891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt paths, num, error); 28908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 28928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (i) 28938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths[--i]); 28948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths); 28951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 28968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 28978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 29008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_blobs - Get all blobs defined for this interface 29011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 29021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 29031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 29041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 29058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 29068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Blobs" property. 29078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 29081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_blobs(DBusMessageIter *iter, DBusError *error, 29091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 29108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 29111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 29121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter, dict_iter, entry_iter, array_iter; 29138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_config_blob *blob; 29148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 29168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "a{say}", &variant_iter) || 29178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY, 29188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "{say}", &dict_iter)) { 29191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 29201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 29218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 29228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = wpa_s->conf->blobs; 29248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (blob) { 29258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_open_container(&dict_iter, 29268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_DICT_ENTRY, 29278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL, &entry_iter) || 29288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_append_basic(&entry_iter, 29298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_STRING, 29308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &(blob->name)) || 29318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_open_container(&entry_iter, 29328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_ARRAY, 29338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_BYTE_AS_STRING, 29348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &array_iter) || 29358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_append_fixed_array(&array_iter, 29368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_BYTE, 29378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &(blob->data), 29388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->len) || 29398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_close_container(&entry_iter, 29408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &array_iter) || 29418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_close_container(&dict_iter, 29428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &entry_iter)) { 29431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, 29441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "no memory"); 29451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 29468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 29478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = blob->next; 29498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 29508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_close_container(&variant_iter, &dict_iter) || 29521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) { 29531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 29541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 29558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 29568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 29581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 29591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 29601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 29611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic struct wpa_bss * get_bss_helper(struct bss_handler_args *args, 29621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, const char *func_name) 29631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 29641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res = wpa_bss_get_id(args->wpa_s, args->id); 29651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 29661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) { 29671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_ERROR, "%s[dbus]: no bss with id %d found", 29681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt func_name, args->id); 29691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 29701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: BSS %d not found", 29711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt func_name, args->id); 29721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 29731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 29741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return res; 29758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 29768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 29798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_bssid - Return the BSSID of a BSS 29801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 29811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 29821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 29831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 29848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 29858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSID" property. 29868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 29871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_bssid(DBusMessageIter *iter, DBusError *error, 29881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 29898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 29901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 29911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 29928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 29941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 29951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 29968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE, 29981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res->bssid, ETH_ALEN, 29991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 30008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 30048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ssid - Return the SSID of a BSS 30051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 30061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 30071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 30081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 30098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 30108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "SSID" property. 30118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 30121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_ssid(DBusMessageIter *iter, DBusError *error, 30131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 30148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 30161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 30178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 30191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 30201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 30218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE, 30231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res->ssid, res->ssid_len, 30241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 30258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 30298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_privacy - Return the privacy flag of a BSS 30301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 30311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 30321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 30331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 30348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 30358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Privacy" property. 30368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 30371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_privacy(DBusMessageIter *iter, 30381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 30398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 30411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 30428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t privacy; 30438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 30451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 30461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 30478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt privacy = (res->caps & IEEE80211_CAP_PRIVACY) ? TRUE : FALSE; 30491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 30501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &privacy, error); 30518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 30558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_mode - Return the mode of a BSS 30561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 30571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 30581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 30591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 30608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 30618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Mode" property. 30628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 30631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_mode(DBusMessageIter *iter, DBusError *error, 30641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 30658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 30671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 30688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *mode; 30698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 30711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 30721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 30738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res->caps & IEEE80211_CAP_IBSS) 30758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mode = "ad-hoc"; 30768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 30778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mode = "infrastructure"; 30788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 30801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &mode, error); 30818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 30858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_level - Return the signal strength of a BSS 30861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 30871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 30881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 30891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 30908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 30918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Level" property. 30928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 30931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_signal(DBusMessageIter *iter, 30941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 30958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 30971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 3098c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt s16 level; 30998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 31011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 31021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 31038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3104c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt level = (s16) res->level; 31051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT16, 3106c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt &level, error); 31078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 31118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_frequency - Return the frequency of a BSS 31121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 31131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 31141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 31151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 31168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 31178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Frequency" property. 31188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 31191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_frequency(DBusMessageIter *iter, 31201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 31218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 31231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 3124c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt u16 freq; 31258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 31271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 31281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 31298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3130c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt freq = (u16) res->freq; 31311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT16, 3132c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt &freq, error); 31338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int cmp_u8s_desc(const void *a, const void *b) 31378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return (*(u8 *) b - *(u8 *) a); 31398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 31438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rates - Return available bit rates of a BSS 31441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 31451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 31461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 31471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 31488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 31498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Rates" property. 31508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 31511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_rates(DBusMessageIter *iter, 31521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 31538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 31551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 31568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *ie_rates = NULL; 31578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u32 *real_rates; 31588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int rates_num, i; 31591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 31608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 31621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 31631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 31648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt rates_num = wpa_bss_get_bit_rates(res, &ie_rates); 31668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (rates_num < 0) 31671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 31688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt qsort(ie_rates, rates_num, 1, cmp_u8s_desc); 31708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt real_rates = os_malloc(sizeof(u32) * rates_num); 31728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!real_rates) { 31738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ie_rates); 31741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 31751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 31768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 31778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < rates_num; i++) 31798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt real_rates[i] = ie_rates[i] * 500000; 31808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_UINT32, 31821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt real_rates, rates_num, 31831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 31848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ie_rates); 31868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(real_rates); 31871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 31888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic dbus_bool_t wpas_dbus_get_bss_security_prop(DBusMessageIter *iter, 31921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_ie_data *ie_data, 31931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error) 31948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter iter_dict, variant_iter; 31968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *group; 319761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt const char *pairwise[3]; /* max 3 pairwise ciphers is supported */ 31988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *key_mgmt[7]; /* max 7 key managements may be supported */ 31998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int n; 32008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 32028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "a{sv}", &variant_iter)) 32038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 32048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict)) 32068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 32078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* KeyMgmt */ 32098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt n = 0; 32108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK) 32118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-psk"; 32128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_PSK) 32138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-ft-psk"; 32148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK_SHA256) 32158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-psk-sha256"; 32168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X) 32178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-eap"; 32188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X) 32198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-ft-eap"; 32208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256) 32218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-eap-sha256"; 32228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_NONE) 32238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-none"; 32248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array(&iter_dict, "KeyMgmt", 32268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt, n)) 32278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 32288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Group */ 32308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (ie_data->group_cipher) { 32318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_WEP40: 32328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "wep40"; 32338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 32348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_TKIP: 32358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "tkip"; 32368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 32378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_CCMP: 32388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "ccmp"; 32398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 324061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt case WPA_CIPHER_GCMP: 324161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt group = "gcmp"; 324261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt break; 32438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_WEP104: 32448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "wep104"; 32458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 32468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 32478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = ""; 32488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 32498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 32508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string(&iter_dict, "Group", group)) 32528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 32538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Pairwise */ 32558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt n = 0; 32568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_TKIP) 32578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pairwise[n++] = "tkip"; 32588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_CCMP) 32598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pairwise[n++] = "ccmp"; 326061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_GCMP) 326161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pairwise[n++] = "gcmp"; 32628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array(&iter_dict, "Pairwise", 32648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pairwise, n)) 32658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 32668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Management group (RSN only) */ 32688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->proto == WPA_PROTO_RSN) { 32698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (ie_data->mgmt_group_cipher) { 32708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 32718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_AES_128_CMAC: 32728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "aes128cmac"; 32738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 32748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 32758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 32768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = ""; 32778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 32788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 32798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string(&iter_dict, "MgmtGroup", 32818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group)) 32828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 32838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 32848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict)) 32868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 32871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_close_container(iter, &variant_iter)) 32888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 32898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 32918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem: 32931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 32941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 32958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 32968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 32998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_wpa - Return the WPA options of a BSS 33001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 33011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 33021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 33031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 33048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 33058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "WPA" property. 33068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 33071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_wpa(DBusMessageIter *iter, DBusError *error, 33081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 33098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 33101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 33111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 33128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ie_data wpa_data; 33138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *ie; 33148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 33161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 33171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 33188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&wpa_data, 0, sizeof(wpa_data)); 33208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie = wpa_bss_get_vendor_ie(res, WPA_IE_VENDOR_TYPE); 33218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie) { 33221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0) { 33231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 33241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "failed to parse WPA IE"); 33251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 33261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 33278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_get_bss_security_prop(iter, &wpa_data, error); 33308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 33318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 33348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rsn - Return the RSN options of a BSS 33351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 33361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 33371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 33381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 33398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 33408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "RSN" property. 33418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 33421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_rsn(DBusMessageIter *iter, DBusError *error, 33431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 33448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 33451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 33461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 33478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ie_data wpa_data; 33488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *ie; 33498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 33511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 33521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 33538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&wpa_data, 0, sizeof(wpa_data)); 33558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie = wpa_bss_get_ie(res, WLAN_EID_RSN); 33568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie) { 33571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0) { 33581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 33591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "failed to parse RSN IE"); 33601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 33611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 33628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_get_bss_security_prop(iter, &wpa_data, error); 33658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 33668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 33698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ies - Return all IEs of a BSS 33701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 33711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 33721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 33731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 33748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 33758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "IEs" property. 33768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 33771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_ies(DBusMessageIter *iter, DBusError *error, 33781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 33798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 33801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 33811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 33828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 33841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 33851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 33868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE, 33881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res + 1, res->ie_len, 33891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 33908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 33918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 33948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_enabled - Check whether network is enabled or disabled 33951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 33961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 33971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 33981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 33998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 34008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "enabled" property of a configured network. 34018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 34021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_enabled(DBusMessageIter *iter, DBusError *error, 34031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 34048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 34051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct network_handler_args *net = user_data; 34068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t enabled = net->ssid->disabled ? FALSE : TRUE; 34071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 34081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 34091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &enabled, error); 34108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 34118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 34148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_enabled - Mark a configured network as enabled or disabled 34151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 34161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 34171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 34181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 34198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 34208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Enabled" property of a configured network. 34218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 34221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_enabled(DBusMessageIter *iter, DBusError *error, 34231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 34248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 34251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct network_handler_args *net = user_data; 34268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 34278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 34288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t enable; 34298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, 34311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &enable)) 34321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 34338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s = net->wpa_s; 34358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = net->ssid; 34368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (enable) 34388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_enable_network(wpa_s, ssid); 34398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 34408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_disable_network(wpa_s, ssid); 34418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 34438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 34448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 34478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_network_properties - Get options for a configured network 34481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 34491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 34501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 34511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 34528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 34538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Properties" property of a configured network. 34548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 34551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_network_properties(DBusMessageIter *iter, 34561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 34571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 34588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 34591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct network_handler_args *net = user_data; 34601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter, dict_iter; 34618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **iterator; 34628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **props = wpa_config_get_all(net->ssid, 1); 34631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 34648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!props) { 34661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 34671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 34688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 34698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, "a{sv}", 34711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &variant_iter) || 34728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !wpa_dbus_dict_open_write(&variant_iter, &dict_iter)) { 34731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 34748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 34758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 34768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator = props; 34788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*iterator) { 34798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string(&dict_iter, *iterator, 34808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *(iterator + 1))) { 34811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, 34821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "no memory"); 34838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 34848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 34858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator += 2; 34868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 34878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_close_write(&variant_iter, &dict_iter) || 34901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) { 34911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 34928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 34938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 34948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = TRUE; 34961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 34978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 34988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator = props; 34998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*iterator) { 35008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(*iterator); 35018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator++; 35028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 35038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(props); 35041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 35058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 35098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_network_properties - Set options for a configured network 35101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 35111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 35121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 35131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 35148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 35158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Properties" property of a configured network. 35168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 35171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_network_properties(DBusMessageIter *iter, 35181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 35191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 35208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct network_handler_args *net = user_data; 35228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid = net->ssid; 35231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter; 35248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_message_iter_recurse(iter, &variant_iter); 35261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return set_network_properties(net->wpa_s, ssid, &variant_iter, error); 35278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 352804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 352904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 353004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AP 353104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 353204949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_subscribe_preq( 353304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessage *message, struct wpa_supplicant *wpa_s) 353404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 353504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpas_dbus_priv *priv = wpa_s->global->dbus; 353604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *name; 353704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 353804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_s->preq_notify_peer != NULL) { 353904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strcmp(dbus_message_get_sender(message), 354004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->preq_notify_peer) == 0) 354104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 354204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 354304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return dbus_message_new_error(message, 354404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_DBUS_ERROR_SUBSCRIPTION_IN_USE, 354504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "Another application is already subscribed"); 354604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 354704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 354804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt name = os_strdup(dbus_message_get_sender(message)); 354904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!name) 355004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 355104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "out of memory"); 355204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 355304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->preq_notify_peer = name; 355404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 355504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* Subscribe to clean up if application closes socket */ 355604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpas_dbus_subscribe_noc(priv); 355704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 355804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* 355904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Double-check it's still alive to make sure that we didn't 356004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * miss the NameOwnerChanged signal, e.g. while strdup'ing. 356104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 356204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_bus_name_has_owner(priv->con, name, NULL)) { 356304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* 356404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Application no longer exists, clean up. 356504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * The return value is irrelevant now. 356604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 356704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Need to check if the NameOwnerChanged handling 356804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * already cleaned up because we have processed 356904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * DBus messages while checking if the name still 357004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * has an owner. 357104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 357204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpa_s->preq_notify_peer) 357304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 357404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(wpa_s->preq_notify_peer); 357504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->preq_notify_peer = NULL; 357604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpas_dbus_unsubscribe_noc(priv); 357704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 357804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 357904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 358004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 358104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 358204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 358304949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_unsubscribe_preq( 358404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessage *message, struct wpa_supplicant *wpa_s) 358504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 358604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpas_dbus_priv *priv = wpa_s->global->dbus; 358704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 358804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpa_s->preq_notify_peer) 358904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return dbus_message_new_error(message, 359004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_DBUS_ERROR_NO_SUBSCRIPTION, 359104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "Not subscribed"); 359204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 359304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strcmp(wpa_s->preq_notify_peer, 359404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_get_sender(message))) 359504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return dbus_message_new_error(message, 359604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_DBUS_ERROR_SUBSCRIPTION_EPERM, 359704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "Can't unsubscribe others"); 359804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 359904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(wpa_s->preq_notify_peer); 360004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->preq_notify_peer = NULL; 360104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpas_dbus_unsubscribe_noc(priv); 360204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 360304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 360404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 360504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 360604949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid wpas_dbus_signal_preq(struct wpa_supplicant *wpa_s, 360704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const u8 *addr, const u8 *dst, const u8 *bssid, 360804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const u8 *ie, size_t ie_len, u32 ssi_signal) 360904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 361004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessage *msg; 361104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessageIter iter, dict_iter; 361204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpas_dbus_priv *priv = wpa_s->global->dbus; 361304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 361404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* Do nothing if the control interface is not turned on */ 361504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (priv == NULL) 361604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return; 361704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 361804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_s->preq_notify_peer == NULL) 361904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return; 362004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 362104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt msg = dbus_message_new_signal(wpa_s->dbus_new_path, 362204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_DBUS_NEW_IFACE_INTERFACE, 362304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "ProbeRequest"); 362404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (msg == NULL) 362504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return; 362604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 362704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_set_destination(msg, wpa_s->preq_notify_peer); 362804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 362904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_iter_init_append(msg, &iter); 363004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 363104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpa_dbus_dict_open_write(&iter, &dict_iter)) 363204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto fail; 363304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (addr && !wpa_dbus_dict_append_byte_array(&dict_iter, "addr", 363404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt (const char *) addr, 363504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ETH_ALEN)) 363604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto fail; 363704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (dst && !wpa_dbus_dict_append_byte_array(&dict_iter, "dst", 363804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt (const char *) dst, 363904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ETH_ALEN)) 364004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto fail; 364104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (bssid && !wpa_dbus_dict_append_byte_array(&dict_iter, "bssid", 364204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt (const char *) bssid, 364304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ETH_ALEN)) 364404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto fail; 364504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (ie && ie_len && !wpa_dbus_dict_append_byte_array(&dict_iter, "ies", 364604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt (const char *) ie, 364704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ie_len)) 364804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto fail; 364904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (ssi_signal && !wpa_dbus_dict_append_int32(&dict_iter, "signal", 365004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ssi_signal)) 365104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto fail; 365204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpa_dbus_dict_close_write(&iter, &dict_iter)) 365304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto fail; 365404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 365504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_connection_send(priv->con, msg, NULL); 365604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto out; 365704949598a23f501be6eec21697465fd46a28840aDmitry Shmidtfail: 365804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "dbus: Failed to construct signal"); 365904949598a23f501be6eec21697465fd46a28840aDmitry Shmidtout: 366004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_unref(msg); 366104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 366204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 366304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AP */ 3664