dbus_new_handlers.c revision 75ecf5267604f166b85a7ee2cf0d9cb682966680
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 * 78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This program is free software; you can redistribute it and/or modify 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * it under the terms of the GNU General Public License version 2 as 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * published by the Free Software Foundation. 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Alternatively, this software may be distributed under the terms of BSD 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * license. 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * See README and COPYING for more details. 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "includes.h" 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common.h" 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/ieee802_11_defs.h" 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "eap_peer/eap_methods.h" 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "eapol_supp/eapol_supp_sm.h" 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "rsn_supp/wpa.h" 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../config.h" 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../wpa_supplicant_i.h" 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../driver_i.h" 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../notify.h" 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../wpas_glue.h" 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../bss.h" 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../scan.h" 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_new_helpers.h" 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_new.h" 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_new_handlers.h" 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_dict_helpers.h" 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtextern int wpa_debug_level; 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtextern int wpa_debug_show_keys; 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtextern int wpa_debug_timestamp; 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *debug_strings[] = { 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "excessive", "msgdump", "debug", "info", "warning", "error", NULL 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_unknown_error - Return a new InvalidArgs error message 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @arg: Optional string appended to error message 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an UnknownError 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_error_unknown_error(DBusMessage *message, 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *arg) 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function can be called as a result of a failure 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * within internal getter calls, which will call this function 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * with a NULL message parameter. However, dbus_message_new_error 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * looks very unkindly (i.e, abort()) on a NULL message, so 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * in this case, we should not call it. 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (message == NULL) { 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_INFO, "dbus: wpas_dbus_error_unknown_error " 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "called with NULL message (arg=%s)", 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt arg ? arg : "N/A"); 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_UNKNOWN_ERROR, 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt arg); 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_iface_unknown - Return a new invalid interface error message 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus error message 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid interface error 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic DBusMessage * wpas_dbus_error_iface_unknown(DBusMessage *message) 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_IFACE_UNKNOWN, 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa_supplicant knows nothing about " 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "this interface."); 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_network_unknown - Return a new NetworkUnknown error message 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid network error 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic DBusMessage * wpas_dbus_error_network_unknown(DBusMessage *message) 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_NETWORK_UNKNOWN, 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "There is no such a network in this " 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "interface."); 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_invalid_args - Return a new InvalidArgs error message 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid options error 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_error_invalid_args(DBusMessage *message, 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *arg) 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply; 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, WPAS_DBUS_ERROR_INVALID_ARGS, 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Did not receive correct message " 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "arguments."); 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (arg != NULL) 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_append_args(reply, DBUS_TYPE_STRING, &arg, 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *dont_quote[] = { 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "key_mgmt", "proto", "pairwise", "auth_alg", "group", "eap", 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "opensc_engine_path", "pkcs11_engine_path", "pkcs11_module_path", 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "bssid", NULL 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic dbus_bool_t should_quote_opt(const char *key) 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i = 0; 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dont_quote[i] != NULL) { 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(key, dont_quote[i]) == 0) 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return FALSE; 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt i++; 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return TRUE; 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * get_iface_by_dbus_path - Get a new network interface 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: Pointer to global data from wpa_supplicant_init() 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @path: Pointer to a dbus object path representing an interface 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Pointer to the interface or %NULL if not found 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_supplicant * get_iface_by_dbus_path( 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global, const char *path) 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) { 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(wpa_s->dbus_new_path, path) == 0) 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_s; 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * set_network_properties - Set properties of a configured network 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @ssid: wpa_ssid structure for a configured network 1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @iter: DBus message iterator containing dictionary of network 1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * properties to set. 1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL when succeed or DBus error on failure 1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Sets network configuration with parameters given id DBus dictionary 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 17575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni MalinenDBusMessage * set_network_properties(DBusMessage *message, 17675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen struct wpa_supplicant *wpa_s, 17775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen struct wpa_ssid *ssid, 17875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen DBusMessageIter *iter) 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_dbus_dict_entry entry = { .type = DBUS_TYPE_STRING }; 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter_dict; 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_open_read(iter, &iter_dict)) 1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_error_invalid_args(message, NULL); 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (wpa_dbus_dict_has_dict_entry(&iter_dict)) { 1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *value = NULL; 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t size = 50; 1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_get_entry(&iter_dict, &entry)) { 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, NULL); 1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (entry.type == DBUS_TYPE_ARRAY && 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.array_type == DBUS_TYPE_BYTE) { 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (entry.array_len <= 0) 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size = entry.array_len * 2 + 1; 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = wpa_snprintf_hex(value, size, 2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (u8 *) entry.bytearray_value, 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.array_len); 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret <= 0) 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (entry.type == DBUS_TYPE_STRING) { 2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (should_quote_opt(entry.key)) { 2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size = os_strlen(entry.str_value); 2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (size <= 0) 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size += 3; 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(value, size, "\"%s\"", 2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.str_value); 2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || (size_t) ret != (size - 1)) 2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_strdup(entry.str_value); 2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (entry.type == DBUS_TYPE_UINT32) { 2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(value, size, "%u", 2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.uint32_value); 2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret <= 0) 2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (entry.type == DBUS_TYPE_INT32) { 2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(value, size, "%d", 2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.int32_value); 2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret <= 0) 2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else 2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_set(ssid, entry.key, value, 0) < 0) 2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((os_strcmp(entry.key, "psk") == 0 && 2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value[0] == '"' && ssid->ssid_len) || 2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (strcmp(entry.key, "ssid") == 0 && ssid->passphrase)) 2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_update_psk(ssid); 2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (os_strcmp(entry.key, "priority") == 0) 2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_update_prio_list(wpa_s->conf); 2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt error: 2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, entry.key); 2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_property_getter - Get basic type property 2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property (must be basic type) 2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @val: pointer to place holding property value 2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The DBus message containing response for Properties.Get call 2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or DBus error message if error occurred. 2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic getter for basic type properties. Type is required to be basic. 2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_simple_property_getter(DBusMessage *message, 2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const int type, const void *val) 2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, variant_iter; 2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_type_is_basic(type)) { 2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "dbus: wpas_dbus_simple_property_getter:" 2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " given type is not basic"); 2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_error_unknown_error(message, NULL); 2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (message == NULL) 3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new(DBUS_MESSAGE_TYPE_SIGNAL); 3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply != NULL) { 3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init_append(reply, &iter); 3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_open_container( 3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter, DBUS_TYPE_VARIANT, 3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_type_as_string(type), &variant_iter) || 3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_append_basic(&variant_iter, type, 3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val) || 3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_close_container(&iter, &variant_iter)) { 3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "dbus: " 3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpas_dbus_simple_property_getter: out of " 3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "memory to put property value into " 3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "message"); 3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, 3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_ERROR_NO_MEMORY, 3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "dbus: wpas_dbus_simple_property_getter:" 3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " out of memory to return property value"); 3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_property_setter - Set basic type property 3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property (must be basic type) 3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @val: pointer to place where value being set will be stored 3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL or DBus error message if error occurred. 3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic setter for basic type properties. Type is required to be basic. 3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_simple_property_setter(DBusMessage *message, 3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const int type, void *val) 3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, variant_iter; 3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_type_is_basic(type)) { 3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "dbus: wpas_dbus_simple_property_setter:" 3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " given type is not basic"); 3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_error_unknown_error(message, NULL); 3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_init(message, &iter)) { 3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "dbus: wpas_dbus_simple_property_setter:" 3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " out of memory to return scanning state"); 3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* omit first and second argument and get value from third */ 3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&iter); 3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&iter); 3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&iter, &variant_iter); 3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&variant_iter) != type) { 3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "dbus: wpas_dbus_simple_property_setter:" 3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " wrong property type"); 3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_error_invalid_args(message, 3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wrong property type"); 3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&variant_iter, val); 3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_array_property_getter - Get array type property 3788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 3798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property array elements (must be basic type) 3808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @array: pointer to array of elements to put into response message 3818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @array_len: length of above array 3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The DBus message containing response for Properties.Get call 3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or DBus error message if error occurred. 3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic getter for array type properties. Array elements type is 3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * required to be basic. 3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_simple_array_property_getter(DBusMessage *message, 3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const int type, 3908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const void *array, 3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t array_len) 3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, variant_iter, array_iter; 3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char type_str[] = "a?"; /* ? will be replaced with subtype letter; */ 3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *sub_type_str; 3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t element_size, i; 3988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_type_is_basic(type)) { 4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "dbus: " 4018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpas_dbus_simple_array_property_getter: given " 4028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "type is not basic"); 4038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_error_unknown_error(message, NULL); 4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sub_type_str = wpa_dbus_type_as_string(type); 4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt type_str[1] = sub_type_str[0]; 4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (message == NULL) 4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new(DBUS_MESSAGE_TYPE_SIGNAL); 4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply == NULL) { 4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "dbus: " 4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpas_dbus_simple_array_property_getter: out of " 4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "memory to create return message"); 4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init_append(reply, &iter); 4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT, 4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt type_str, &variant_iter) || 4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY, 4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sub_type_str, &array_iter)) { 4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "dbus: " 4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpas_dbus_simple_array_property_getter: out of " 4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "memory to open container"); 4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 4318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 4328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch(type) { 4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_BYTE: 4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_BOOLEAN: 4388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = 1; 4398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_INT16: 4418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_UINT16: 4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(uint16_t); 4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_INT32: 4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_UINT32: 4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(uint32_t); 4478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_INT64: 4498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_UINT64: 4508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(uint64_t); 4518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_DOUBLE: 4538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(double); 4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_STRING: 4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_OBJECT_PATH: 4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(char *); 4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 4608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "dbus: " 4618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpas_dbus_simple_array_property_getter: " 4628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "fatal: unknown element type"); 4638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = 1; 4648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < array_len; i++) { 4688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_append_basic(&array_iter, type, 4698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt array + i * element_size); 4708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_close_container(&variant_iter, &array_iter) || 4738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_close_container(&iter, &variant_iter)) { 4748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "dbus: " 4758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpas_dbus_simple_array_property_getter: out of " 4768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "memory to close container"); 4778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 4788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 4798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 4808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 4838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 4878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_create_interface - Request registration of a network iface 4888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 4898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure 4908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the new interface object, 4918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or a dbus error message with more information 4928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 4938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "CreateInterface" method call. Handles requests 4948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to register a network interface that wpa_supplicant 4958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * will manage. 4968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 4978d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_create_interface(DBusMessage *message, 4988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 4998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter_dict; 5018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 5028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter; 5038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_dbus_dict_entry entry; 5048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *driver = NULL; 5058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *ifname = NULL; 5068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *confname = NULL; 5078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *bridge_ifname = NULL; 5088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 5108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_open_read(&iter, &iter_dict)) 5128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 5138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (wpa_dbus_dict_has_dict_entry(&iter_dict)) { 5148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_get_entry(&iter_dict, &entry)) 5158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 5168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!strcmp(entry.key, "Driver") && 5178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (entry.type == DBUS_TYPE_STRING)) { 5188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt driver = os_strdup(entry.str_value); 5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (driver == NULL) 5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (!strcmp(entry.key, "Ifname") && 5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (entry.type == DBUS_TYPE_STRING)) { 5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ifname = os_strdup(entry.str_value); 5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ifname == NULL) 5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (!strcmp(entry.key, "ConfigFile") && 5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (entry.type == DBUS_TYPE_STRING)) { 5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt confname = os_strdup(entry.str_value); 5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (confname == NULL) 5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (!strcmp(entry.key, "BridgeIfname") && 5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (entry.type == DBUS_TYPE_STRING)) { 5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bridge_ifname = os_strdup(entry.str_value); 5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bridge_ifname == NULL) 5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ifname == NULL) 5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; /* Required Ifname argument missing */ 5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Try to get the wpa_supplicant record for this iface, return 5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * an error if we already control it. 5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_get_iface(global, ifname) != NULL) { 5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, 5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPAS_DBUS_ERROR_IFACE_EXISTS, 5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa_supplicant already " 5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "controls this interface."); 5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_interface iface; 5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&iface, 0, sizeof(iface)); 5628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.driver = driver; 5638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.ifname = ifname; 5648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.confname = confname; 5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.bridge_ifname = bridge_ifname; 5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Otherwise, have wpa_supplicant attach to it. */ 5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((wpa_s = wpa_supplicant_add_iface(global, &iface))) { 5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *path = wpa_s->dbus_new_path; 5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, 5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &path, DBUS_TYPE_INVALID); 5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_unknown_error( 5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "wpa_supplicant couldn't grab this " 5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "interface."); 5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(driver); 5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ifname); 5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bridge_ifname); 5838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterror: 5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, NULL); 5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 5928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_interface - Request deregistration of an interface 5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: wpa_supplicant global data structure 5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing a UINT32 indicating success (1) or 5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * failure (0), or returns a dbus error message with more information 5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "removeInterface" method call. Handles requests 5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to deregister a network interface that wpa_supplicant 6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * currently manages. 6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_interface(DBusMessage *message, 6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *path; 6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &path, 6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 6118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s = get_iface_by_dbus_path(global, path); 6138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s == NULL) 6148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_iface_unknown(message); 6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (wpa_supplicant_remove_iface(global, wpa_s)) { 6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_unknown_error( 6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "wpa_supplicant couldn't remove this " 6188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "interface."); 6198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 6268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_interface - Get the object path for an interface name 6278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 6288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure 6298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the interface object, 6308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or a dbus error message with more information 6318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 6328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "getInterface" method call. 6338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 6348d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_interface(DBusMessage *message, 6358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *ifname; 6398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *path; 6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &ifname, 6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s = wpa_supplicant_get_iface(global, ifname); 6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s == NULL) 6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_error_iface_unknown(message); 6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt path = wpa_s->dbus_new_path; 6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply == NULL) 6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path, 6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID)) { 6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_level - Get debug level 6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure 6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: DBus message with value of debug level 6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugLevel" property. 6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_debug_level(DBusMessage *message, 6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *str; 6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int idx = wpa_debug_level; 6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (idx < 0) 6798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt idx = 0; 6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (idx > 5) 6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt idx = 5; 6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt str = debug_strings[idx]; 6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_simple_property_getter(message, DBUS_TYPE_STRING, 6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &str); 6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_timestamp - Get debug timestamp 6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure 6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: DBus message with value of debug timestamp 6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugTimestamp" property. 6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_debug_timestamp(DBusMessage *message, 6978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 6988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_simple_property_getter(message, DBUS_TYPE_BOOLEAN, 7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &wpa_debug_timestamp); 7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_show_keys - Get debug show keys 7078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 7088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure 7098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: DBus message with value of debug show_keys 7108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugShowKeys" property. 7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7138d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_debug_show_keys(DBusMessage *message, 7148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 7158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_simple_property_getter(message, DBUS_TYPE_BOOLEAN, 7178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &wpa_debug_show_keys); 7188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_level - Set debug level 7238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 7248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure 7258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: %NULL or DBus error message 7268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugLevel" property. 7288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7298d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_setter_debug_level(DBusMessage *message, 7308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 7318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply; 7338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *str = NULL; 7348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i, val = -1; 7358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_simple_property_setter(message, DBUS_TYPE_STRING, 7378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &str); 7388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply) 7398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 7408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; debug_strings[i]; i++) 7428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(debug_strings[i], str) == 0) { 7438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val = i; 7448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 7458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (val < 0 || 7488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_set_debug_params(global, val, wpa_debug_timestamp, 7498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_show_keys)) { 7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_error_invalid_args( 7518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong debug level value"); 7528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 7558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_timestamp - Set debug timestamp 7608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 7618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure 7628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: %NULL or DBus error message 7638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugTimestamp" property. 7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_setter_debug_timestamp(DBusMessage *message, 7678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 7688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply; 7708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t val; 7718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_simple_property_setter(message, DBUS_TYPE_BOOLEAN, 7738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &val); 7748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply) 7758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 7768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_set_debug_params(global, wpa_debug_level, val ? 1 : 0, 7788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_show_keys); 7798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 7818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_show_keys - Set debug show keys 7868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 7878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure 7888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: %NULL or DBus error message 7898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugShowKeys" property. 7918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7928d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_setter_debug_show_keys(DBusMessage *message, 7938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 7948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply; 7968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t val; 7978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_simple_property_setter(message, DBUS_TYPE_BOOLEAN, 7998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &val); 8008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply) 8018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 8028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_set_debug_params(global, wpa_debug_level, 8048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_timestamp, 8058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val ? 1 : 0); 8068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 8088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 8128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_interfaces - Request registered interfaces list 8138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 8148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure 8158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object paths array containing registered interfaces 8168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * objects paths or DBus error on failure 8178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 8188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Interfaces" property. Handles requests 8198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of registered interfaces objects 8208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * paths 8218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 8228d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_interfaces(DBusMessage *message, 8238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 8248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 8268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 8278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char **paths; 8288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int i = 0, num = 0; 8298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) 8318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt num++; 8328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt paths = os_zalloc(num * sizeof(char*)); 8348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!paths) { 8358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 8368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 8378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) 8408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt paths[i++] = wpa_s->dbus_new_path; 8418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_simple_array_property_getter(message, 8438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_OBJECT_PATH, 8448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt paths, num); 8458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths); 8478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 8488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 8528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_eap_methods - Request supported EAP methods list 8538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 8548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @nothing: not used argument. may be NULL or anything else 8558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object paths array containing supported EAP methods 8568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * represented by strings or DBus error on failure 8578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 8588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "EapMethods" property. Handles requests 8598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of strings with supported EAP methods 8608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 8618d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_eap_methods(DBusMessage *message, void *nothing) 8628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 8648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **eap_methods; 8658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t num_items = 0; 8668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eap_methods = eap_get_names_as_string_array(&num_items); 8688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!eap_methods) { 8698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 8708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 8718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_simple_array_property_getter(message, 8748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_STRING, 8758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eap_methods, num_items); 8768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (num_items) 8788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(eap_methods[--num_items]); 8798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(eap_methods); 8808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 8818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_type(DBusMessage *message, DBusMessageIter *var, 8858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **type, DBusMessage **reply) 8868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_STRING) { 8888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 8898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Type must be a string"); 8908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 8918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong Type value type. String required"); 8928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 8938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(var, type); 8958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 8968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ssids(DBusMessage *message, DBusMessageIter *var, 9008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params *params, 9018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage **reply) 9028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_ssid *ssids = params->ssids; 9048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t ssids_num = 0; 9058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *ssid; 9068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter array_iter, sub_array_iter; 9078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *val; 9088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int len; 9098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) { 9118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: ssids " 9128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "must be an array of arrays of bytes"); 9138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 9148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong SSIDs value type. Array of arrays of " 9158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "bytes required"); 9168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(var, &array_iter); 9208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY || 9228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE) 9238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 9248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: ssids " 9258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "must be an array of arrays of bytes"); 9268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 9278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong SSIDs value type. Array of arrays of " 9288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "bytes required"); 9298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY) 9338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 9348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssids_num >= WPAS_MAX_SCAN_SSIDS) { 9358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 9368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Too many ssids specified on scan dbus " 9378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "call"); 9388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 9398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Too many ssids specified. Specify " 9408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "at most four"); 9418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&array_iter, &sub_array_iter); 9458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len); 9478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (len != 0) { 9498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = os_malloc(len); 9508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 9518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, 9528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpas_dbus_handler_scan[dbus]: " 9538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "out of memory. Cannot allocate " 9548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "memory for SSID"); 9558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = dbus_message_new_error( 9568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, DBUS_ERROR_NO_MEMORY, NULL); 9578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(ssid, val, len); 9608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 9618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Allow zero-length SSIDs */ 9628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = NULL; 9638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssids[ssids_num].ssid = ssid; 9668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssids[ssids_num].ssid_len = len; 9678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 9698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssids_num++; 9708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->num_ssids = ssids_num; 9738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 9748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ies(DBusMessage *message, DBusMessageIter *var, 9788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params *params, 9798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage **reply) 9808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *ies = NULL, *nies; 9828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ies_len = 0; 9838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter array_iter, sub_array_iter; 9848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *val; 9858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int len; 9868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) { 9888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: ies must " 9898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "be an array of arrays of bytes"); 9908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 9918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong IEs value type. Array of arrays of " 9928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "bytes required"); 9938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(var, &array_iter); 9978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY || 9998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE) 10008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 10018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: ies must " 10028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "be an array of arrays of bytes"); 10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong IEs value type. Array required"); 10058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY) 10098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 10108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&array_iter, &sub_array_iter); 10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len); 10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (len == 0) { 10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nies = os_realloc(ies, ies_len + len); 10198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nies == NULL) { 10208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "out of memory. Cannot allocate memory for " 10228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "IE"); 10238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ies); 10248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = dbus_message_new_error( 10258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, DBUS_ERROR_NO_MEMORY, NULL); 10268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ies = nies; 10298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(ies + ies_len, val, len); 10308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ies_len += len; 10318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 10338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->extra_ies = ies; 10368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->extra_ies_len = ies_len; 10378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 10388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_channels(DBusMessage *message, 10428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter *var, 10438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params *params, 10448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage **reply) 10458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter array_iter, sub_array_iter; 10478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int *freqs = NULL, *nfreqs; 10488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int freqs_num = 0; 10498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) { 10518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 10528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Channels must be an array of structs"); 10538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong Channels value type. Array of structs " 10558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "required"); 10568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(var, &array_iter); 10608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_STRUCT) { 10628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, 10638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpas_dbus_handler_scan[dbus]: Channels must be an " 10648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "array of structs"); 10658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong Channels value type. Array of structs " 10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "required"); 10688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_STRUCT) 10728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 10738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int freq, width; 10748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&array_iter, &sub_array_iter); 10768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&sub_array_iter) != 10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_UINT32) { 10798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 10808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Channel must by specified by struct of " 10818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "two UINT32s %c", 10828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_arg_type( 10838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &sub_array_iter)); 10848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong Channel struct. Two UINT32s " 10868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "required"); 10878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 10888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&sub_array_iter, &freq); 10918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_next(&sub_array_iter) || 10938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_arg_type(&sub_array_iter) != 10948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_UINT32) { 10958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 10968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Channel must by specified by struct of " 10978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "two UINT32s"); 10988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, 11008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Wrong Channel struct. Two UINT32s required"); 11018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 11028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&sub_array_iter, &width); 11068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define FREQS_ALLOC_CHUNK 32 11088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (freqs_num % FREQS_ALLOC_CHUNK == 0) { 11098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nfreqs = os_realloc(freqs, sizeof(int) * 11108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (freqs_num + FREQS_ALLOC_CHUNK)); 11118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nfreqs == NULL) 11128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 11138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs = nfreqs; 11148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (freqs == NULL) { 11168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 11178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "out of memory. can't allocate memory for " 11188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "freqs"); 11198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = dbus_message_new_error( 11208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, DBUS_ERROR_NO_MEMORY, NULL); 11218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs[freqs_num] = freq; 11258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs_num++; 11278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 11288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nfreqs = os_realloc(freqs, 11318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(int) * (freqs_num + 1)); 11328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nfreqs == NULL) 11338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 11348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs = nfreqs; 11358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (freqs == NULL) { 11368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 11378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "out of memory. Can't allocate memory for freqs"); 11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = dbus_message_new_error( 11398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, DBUS_ERROR_NO_MEMORY, NULL); 11408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs[freqs_num] = 0; 11438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->freqs = freqs; 11458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 11468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 11478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 11508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_scan - Request a wireless scan on an interface 11518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 11528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 11538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL indicating success or DBus error message on failure 11548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 11558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Scan" method call of a network device. Requests 11568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * that wpa_supplicant perform a wireless scan as soon as possible 11578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * on a particular wireless interface. 11588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 11598d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_scan(DBusMessage *message, 11608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 11618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 11628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 11638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, dict_iter, entry_iter, variant_iter; 11648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *key = NULL, *type = NULL; 11658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params params; 11668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t i; 11678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(¶ms, 0, sizeof(params)); 11698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 11718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&iter, &dict_iter); 11738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dbus_message_iter_get_arg_type(&dict_iter) == 11758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_DICT_ENTRY) { 11768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&dict_iter, &entry_iter); 11778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&entry_iter, &key); 11788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&entry_iter); 11798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&entry_iter, &variant_iter); 11808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(key, "Type") == 0) { 11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_type(message, &variant_iter, 11838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &type, &reply) < 0) 11848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 11858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(key, "SSIDs") == 0) { 11868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_ssids(message, &variant_iter, 11878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ¶ms, &reply) < 0) 11888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 11898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(key, "IEs") == 0) { 11908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_ies(message, &variant_iter, 11918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ¶ms, &reply) < 0) 11928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 11938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(key, "Channels") == 0) { 11948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_channels(message, &variant_iter, 11958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ¶ms, &reply) < 0) 11968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 11978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 11988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 11998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Unknown argument %s", key); 12008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, key); 12018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 12028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&dict_iter); 12058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!type) { 12088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 12098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Scan type not specified"); 12108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, key); 12118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 12128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!os_strcmp(type, "passive")) { 12158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (params.num_ssids || params.extra_ies_len) { 12168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 12178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "SSIDs or IEs specified for passive scan."); 12188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args( 12198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "You can specify only Channels in " 12208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "passive scan"); 12218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 12228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (params.freqs && params.freqs[0]) { 12238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_trigger_scan(wpa_s, ¶ms); 12248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 12258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->scan_req = 2; 12268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_req_scan(wpa_s, 0, 0); 12278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (!os_strcmp(type, "active")) { 12298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!params.num_ssids) { 12308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Add wildcard ssid */ 12318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.num_ssids++; 12328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_trigger_scan(wpa_s, ¶ms); 12348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 12358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: " 12368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Unknown scan type: %s", type); 12378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, 12388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Wrong scan type"); 12398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 12408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 12438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < WPAS_MAX_SCAN_SSIDS; i++) 12448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free((u8 *) params.ssids[i].ssid); 12458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free((u8 *) params.extra_ies); 12468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(params.freqs); 12478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 12488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 12498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 12528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_disconnect - Terminate the current connection 12538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 12548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 12558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NotConnected DBus error message if already not connected 12568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or NULL otherwise. 12578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 12588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Disconnect" method call of network interface. 12598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 12608d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_disconnect(DBusMessage *message, 12618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 12628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 12638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->current_ssid != NULL) { 12648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->disconnected = 1; 12658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_deauthenticate(wpa_s, 12668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WLAN_REASON_DEAUTH_LEAVING); 12678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 12698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_NOT_CONNECTED, 12728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "This interface is not connected"); 12738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 12748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 12778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_add_network - Add a new configured network 12788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 12798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 12808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing the object path of the new network 12818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 12828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "AddNetwork" method call of a network interface. 12838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 12848d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_network(DBusMessage *message, 12858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 12868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 12878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 12888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter; 12898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid = NULL; 12908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *path = path_buf; 12918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 12938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = wpa_config_add_network(wpa_s->conf); 12958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 12968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "wpas_dbus_handler_add_network[dbus]: " 12978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "can't add new interface."); 12988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_unknown_error( 12998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, 13008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa_supplicant could not add " 13018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "a network on this interface."); 13028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 13038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_added(wpa_s, ssid); 13058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid->disabled = 1; 13068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_set_network_defaults(ssid); 13078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = set_network_properties(message, wpa_s, ssid, &iter); 13098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply) { 13108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_handler_add_network[dbus]:" 13118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "control interface couldn't set network " 13128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "properties"); 13138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 13148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Construct the object path for this network. */ 13178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX, 13188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d", 13198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, ssid->id); 13208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 13228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply == NULL) { 13238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 13248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 13258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 13268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path, 13288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID)) { 13298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 13308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 13318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 13328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 13338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 13368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr: 13388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid) { 13398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_removed(wpa_s, ssid); 13408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_remove_network(wpa_s->conf, ssid->id); 13418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 13438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 13448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 13478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_network - Remove a configured network 13488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 13498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 13508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure 13518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 13528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveNetwork" method call of a network interface. 13538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 13548d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_network(DBusMessage *message, 13558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 13568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 13578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 13588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *op; 13598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *iface = NULL, *net_id = NULL; 13608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int id; 13618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 13628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op, 13648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 13658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Extract the network ID and ensure the network */ 13678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* is actually a child of this interface */ 136875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen iface = wpas_dbus_new_decompose_object_path(op, 0, &net_id, NULL); 13698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (iface == NULL || os_strcmp(iface, wpa_s->dbus_new_path) != 0) { 13708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 13718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt id = strtoul(net_id, NULL, 10); 13758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (errno == EINVAL) { 13768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 13778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 13818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 13828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_network_unknown(message); 13838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_removed(wpa_s, ssid); 13878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_remove_network(wpa_s->conf, id) < 0) { 13898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, 13908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpas_dbus_handler_remove_network[dbus]: " 13918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "error occurred when removing network %d", id); 13928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_unknown_error( 13938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "error removing the specified network on " 13948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "this interface."); 13958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == wpa_s->current_ssid) 13998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_deauthenticate(wpa_s, 14008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WLAN_REASON_DEAUTH_LEAVING); 14018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 14038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(iface); 14048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(net_id); 14058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 14068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 14078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void remove_network(void *arg, struct wpa_ssid *ssid) 14108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 14118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = arg; 14128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_removed(wpa_s, ssid); 14148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_remove_network(wpa_s->conf, ssid->id) < 0) { 14168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, 14178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpas_dbus_handler_remove_all_networks[dbus]: " 14188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "error occurred when removing network %d", 14198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid->id); 14208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 14218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == wpa_s->current_ssid) 14248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_disassociate(wpa_s, WLAN_REASON_DEAUTH_LEAVING); 14258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 14268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 14298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_all_networks - Remove all configured networks 14308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 14318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 14328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure 14338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 14348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveAllNetworks" method call of a network interface. 14358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 14368d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_all_networks( 14378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *message, struct wpa_supplicant *wpa_s) 14388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 14398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* NB: could check for failure and return an error */ 14408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_foreach_network(wpa_s->conf, remove_network, wpa_s); 14418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 14428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 14438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 14468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_select_network - Attempt association with a network 14478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 14488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 14498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure 14508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 14518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "SelectNetwork" method call of network interface. 14528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 14538d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_select_network(DBusMessage *message, 14548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 14558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 14568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 14578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *op; 14588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *iface = NULL, *net_id = NULL; 14598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int id; 14608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 14618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op, 14638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 14648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Extract the network ID and ensure the network */ 14668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* is actually a child of this interface */ 146775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen iface = wpas_dbus_new_decompose_object_path(op, 0, &net_id, NULL); 14688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (iface == NULL || os_strcmp(iface, wpa_s->dbus_new_path) != 0) { 14698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 14708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 14718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt id = strtoul(net_id, NULL, 10); 14748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (errno == EINVAL) { 14758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 14768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 14778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 14808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 14818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_network_unknown(message); 14828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 14838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Finally, associate with the network */ 14868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_select_network(wpa_s, ssid); 14878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 14898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(iface); 14908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(net_id); 14918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 14928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 14938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 14968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_add_blob - Store named binary blob (ie, for certificates) 14978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 14988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 14998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing an error on failure or NULL on success 15008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 15018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally store a binary blobs. 15028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 15038d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_blob(DBusMessage *message, 15048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 15058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 15068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 15078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, array_iter; 15088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *blob_name; 15108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *blob_data; 15118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int blob_len; 15128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_config_blob *blob = NULL; 15138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 15158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&iter, &blob_name); 15168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_get_blob(wpa_s->conf, blob_name)) { 15188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, 15198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPAS_DBUS_ERROR_BLOB_EXISTS, 15208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 15218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&iter); 15248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&iter, &array_iter); 15258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_fixed_array(&array_iter, &blob_data, &blob_len); 15278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = os_zalloc(sizeof(*blob)); 15298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!blob) { 15308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 15318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 15328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 15338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->data = os_malloc(blob_len); 15368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!blob->data) { 15378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 15388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 15398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 15408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(blob->data, blob_data, blob_len); 15428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->len = blob_len; 15448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->name = os_strdup(blob_name); 15458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!blob->name) { 15468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 15478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 15488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 15498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_set_blob(wpa_s->conf, blob); 15528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_blob_added(wpa_s, blob->name); 15538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 15558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr: 15578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (blob) { 15588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(blob->name); 15598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(blob->data); 15608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(blob); 15618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 15638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 15648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 15678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_blob - Get named binary blob (ie, for certificates) 15688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 15698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 15708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing array of bytes (blob) 15718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 15728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Gets one wpa_supplicant's binary blobs. 15738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 15748d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_blob(DBusMessage *message, 15758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 15768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 15778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 15788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, array_iter; 15798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *blob_name; 15818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct wpa_config_blob *blob; 15828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name, 15848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 15858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = wpa_config_get_blob(wpa_s->conf, blob_name); 15878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!blob) { 15888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, 15898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPAS_DBUS_ERROR_BLOB_UNKNOWN, 15908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Blob id not set"); 15918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 15948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!reply) { 15958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 15968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 15978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 15988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init_append(reply, &iter); 16018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, 16038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_BYTE_AS_STRING, 16048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &array_iter)) { 16058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 16068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 16078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 16088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 16098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_append_fixed_array(&array_iter, DBUS_TYPE_BYTE, 16128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &(blob->data), blob->len)) { 16138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 16148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 16158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 16168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 16178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_close_container(&iter, &array_iter)) { 16208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 16218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 16228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 16238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 16248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 16278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 16288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 16298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 16328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_remove_handler_remove_blob - Remove named binary blob 16338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 16348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 16358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error 16368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 16378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally remove a binary blobs. 16388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 16398d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_blob(DBusMessage *message, 16408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 16418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 16428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 16438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *blob_name; 16448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name, 16468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 16478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_remove_blob(wpa_s->conf, blob_name)) { 16498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, 16508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPAS_DBUS_ERROR_BLOB_UNKNOWN, 16518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Blob id not set"); 16528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_blob_removed(wpa_s, blob_name); 16548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 16568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 16588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 16608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_flush_bss - Flush the BSS cache 16618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 16628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 16638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL 16648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 16658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "FlushBSS" method call of network interface. 16668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 16678d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_flush_bss(DBusMessage *message, 16688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 16698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 16708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t age; 16718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_UINT32, &age, 16738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 16748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (age == 0) 16768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_bss_flush(wpa_s); 16778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 16788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_bss_flush_by_age(wpa_s, age); 16798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 16818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 16828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 16858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_capabilities - Return interface capabilities 16868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 16878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 16888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing a dict of strings 16898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 16908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Capabilities" property of an interface. 16918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 16928d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_capabilities(DBusMessage *message, 16938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 16948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 16958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 16968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_capa capa; 16978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 16988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, iter_dict; 16998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter_dict_entry, iter_dict_val, iter_array, 17008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt variant_iter; 17018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *scans[] = { "active", "passive", "ssid" }; 17028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (message == NULL) 17048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new(DBUS_MESSAGE_TYPE_SIGNAL); 17058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 17068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 17078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!reply) 17088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 17098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init_append(reply, &iter); 17118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT, 17128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "a{sv}", &variant_iter)) 17138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 17148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict)) 17168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 17178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = wpa_drv_get_capa(wpa_s, &capa); 17198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** pairwise cipher */ 17218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 17228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = {"ccmp", "tkip", "none"}; 17238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 17248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "Pairwise", args, 17258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(args) / sizeof(char*))) 17268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 17278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 17288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Pairwise", 17298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 17308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 17318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 17328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 17338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) { 17358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 17368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "ccmp")) 17378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 17388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) { 17418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 17428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "tkip")) 17438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 17448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) { 17478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 17488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "none")) 17498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 17508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_end_string_array(&iter_dict, 17538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 17548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 17558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 17568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 17578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** group cipher */ 17608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 17618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { 17628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "ccmp", "tkip", "wep104", "wep40" 17638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }; 17648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 17658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "Group", args, 17668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(args) / sizeof(char*))) 17678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 17688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 17698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Group", 17708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 17718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 17728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 17738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 17748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) { 17768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 17778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "ccmp")) 17788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 17798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) { 17828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 17838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "tkip")) 17848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 17858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_WEP104) { 17888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 17898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wep104")) 17908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 17918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.enc & WPA_DRIVER_CAPA_ENC_WEP40) { 17948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 17958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wep40")) 17968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 17978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_end_string_array(&iter_dict, 18008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 18018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 18028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 18038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 18048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** key management */ 18078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 18088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { 18098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa-psk", "wpa-eap", "ieee8021x", "wpa-none", 18108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 18118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wps", 18128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 18138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "none" 18148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }; 18158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 18168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "KeyMgmt", args, 18178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(args) / sizeof(char*))) 18188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 18198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 18208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "KeyMgmt", 18218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 18228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 18238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 18248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 18258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element(&iter_array, 18278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "none")) 18288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 18298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element(&iter_array, 18318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "ieee8021x")) 18328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 18338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA | 18358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2)) { 18368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 18378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-eap")) 18388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 18398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_FT) 18418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 18428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-ft-eap")) 18438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 18448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */ 18468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 18478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 18488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-eap-sha256")) 18498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 18508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 18518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK | 18548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) { 18558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 18568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-psk")) 18578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 18588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_FT_PSK) 18608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 18618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-ft-psk")) 18628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 18638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */ 18658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 18668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 18678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-psk-sha256")) 18688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 18698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 18708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) { 18738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 18748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-none")) 18758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 18768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 18808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element(&iter_array, 18818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wps")) 18828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 18838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 18848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_end_string_array(&iter_dict, 18868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 18878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 18888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 18898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 18908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** WPA protocol */ 18938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 18948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { "rsn", "wpa" }; 18958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 18968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "Protocol", args, 18978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(args) / sizeof(char*))) 18988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 18998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 19008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Protocol", 19018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 19028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 19038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 19048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA2 | 19078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) { 19088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 19098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "rsn")) 19108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA | 19148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK)) { 19158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 19168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa")) 19178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_end_string_array(&iter_dict, 19218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 19228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 19238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 19248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** auth alg */ 19288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 19298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { "open", "shared", "leap" }; 19308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 19318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "AuthAlg", args, 19328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(args) / sizeof(char*))) 19338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 19358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "AuthAlg", 19368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 19378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 19388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 19398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.auth & (WPA_DRIVER_AUTH_OPEN)) { 19428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 19438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "open")) 19448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.auth & (WPA_DRIVER_AUTH_SHARED)) { 19488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 19498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "shared")) 19508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.auth & (WPA_DRIVER_AUTH_LEAP)) { 19548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 19558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "leap")) 19568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_end_string_array(&iter_dict, 19608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 19618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 19628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 19638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** Scan */ 19678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array(&iter_dict, "Scan", scans, 19688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(scans) / sizeof(char *))) 19698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** Modes */ 197275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Modes", 197375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_entry, 197475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_val, 197575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_array)) 19768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 19778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 197875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!wpa_dbus_dict_string_array_add_element( 197975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_array, "infrastructure")) 198075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen goto nomem; 198175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen 198275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!wpa_dbus_dict_string_array_add_element( 198375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_array, "ad-hoc")) 198475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen goto nomem; 198575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen 198675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (res >= 0) { 198775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (capa.flags & (WPA_DRIVER_FLAGS_AP)) { 198875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!wpa_dbus_dict_string_array_add_element( 198975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_array, "ap")) 199075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen goto nomem; 199175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen } 199275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen 199375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (capa.flags & (WPA_DRIVER_FLAGS_P2P_CAPABLE)) { 199475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!wpa_dbus_dict_string_array_add_element( 199575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_array, "p2p")) 199675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen goto nomem; 199775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen } 199875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen } 199975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen 200075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!wpa_dbus_dict_end_string_array(&iter_dict, 200175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_entry, 200275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_val, 200375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_array)) 200475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen goto nomem; 200575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen /***** Modes end */ 200675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen 20078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict)) 20088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_close_container(&iter, &variant_iter)) 20108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 20118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 20138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem: 20158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply) 20168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 20178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, NULL); 20198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 20208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 20238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_state - Get interface state 20248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 20258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 20268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing a STRING representing the current 20278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * interface state 20288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 20298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "State" property. 20308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 20318d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_state(DBusMessage *message, 20328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 20338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 20348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 20358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *str_state; 20368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *state_ls, *tmp; 20378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt str_state = wpa_supplicant_state_txt(wpa_s->wpa_state); 20398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* make state string lowercase to fit new DBus API convention 20418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 20428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt state_ls = tmp = os_strdup(str_state); 20438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!tmp) { 20448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 20458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 20468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*tmp) { 20488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *tmp = tolower(*tmp); 20498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tmp++; 20508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_simple_property_getter(message, DBUS_TYPE_STRING, 20538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &state_ls); 20548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(state_ls); 20568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 20588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 20598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 20628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_get_scanning - Get interface scanning state 20638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 20648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 20658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing whether the interface is scanning 20668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 20678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "scanning" property. 20688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 20698d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_scanning(DBusMessage *message, 20708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 20718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 20728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t scanning = wpa_s->scanning ? TRUE : FALSE; 20738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_simple_property_getter(message, DBUS_TYPE_BOOLEAN, 20748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &scanning); 20758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 20768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 20798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ap_scan - Control roaming mode 20808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 20818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 20828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A message containong value of ap_scan variable 20838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 20848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "ApScan" property. 20858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 20868d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_ap_scan(DBusMessage *message, 20878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 20888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 20898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t ap_scan = wpa_s->conf->ap_scan; 20908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_simple_property_getter(message, DBUS_TYPE_UINT32, 20918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &ap_scan); 20928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 20938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 20968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_ap_scan - Control roaming mode 20978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 20988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 20998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL 21008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 21018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "ApScan" property. 21028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 21038d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_setter_ap_scan(DBusMessage *message, 21048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 21058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 21068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 21078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t ap_scan; 21088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_simple_property_setter(message, DBUS_TYPE_UINT32, 21108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &ap_scan); 21118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply) 21128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 21138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_set_ap_scan(wpa_s, ap_scan)) { 21158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_error_invalid_args( 21168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "ap_scan must equal 0, 1 or 2"); 21178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 21198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 21208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 21238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_age - Get BSS entry expiration age 21248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 21258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 21268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A message containing value of bss_expiration_age variable 21278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 21288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "BSSExpireAge" property. 21298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 21308d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_bss_expire_age(DBusMessage *message, 21318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 21328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 21338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t expire_age = wpa_s->conf->bss_expiration_age; 21348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_simple_property_getter(message, DBUS_TYPE_UINT32, 21358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &expire_age); 21368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 21378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 21408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_age - Control BSS entry expiration age 21418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 21428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 21438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL 21448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 21458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "BSSExpireAge" property. 21468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 21478d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_setter_bss_expire_age(DBusMessage *message, 21488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 21498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 21508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 21518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t expire_age; 21528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_simple_property_setter(message, DBUS_TYPE_UINT32, 21548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &expire_age); 21558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply) 21568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 21578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_set_bss_expiration_age(wpa_s, expire_age)) { 21598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_error_invalid_args( 21608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "BSSExpireAge must be >=10"); 21618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 21638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 21648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 21678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_count - Get BSS entry expiration scan count 21688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 21698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 21708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A message containing value of bss_expire_count variable 21718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 21728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "BSSExpireCount" property. 21738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 21748d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_bss_expire_count(DBusMessage *message, 21758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 21768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 21778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t expire_count = wpa_s->conf->bss_expiration_age; 21788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_simple_property_getter(message, DBUS_TYPE_UINT32, 21798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &expire_count); 21808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 21818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 21848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_count - Control BSS entry expiration scan count 21858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 21868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 21878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL 21888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 21898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "BSSExpireCount" property. 21908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 21918d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_setter_bss_expire_count(DBusMessage *message, 21928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 21938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 21948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 21958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t expire_count; 21968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_simple_property_setter(message, DBUS_TYPE_UINT32, 21988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &expire_count); 21998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply) 22008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 22018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_set_bss_expiration_count(wpa_s, expire_count)) { 22038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_error_invalid_args( 22048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "BSSExpireCount must be >0"); 22058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 22078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 22088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 22118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_country - Control country code 22128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 22138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 22148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A message containong value of country variable 22158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 22168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "Country" property. 22178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 22188d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_country(DBusMessage *message, 22198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 22208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 22218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char country[3]; 22228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *str = country; 22238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt country[0] = wpa_s->conf->country[0]; 22258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt country[1] = wpa_s->conf->country[1]; 22268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt country[2] = '\0'; 22278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_simple_property_getter(message, DBUS_TYPE_STRING, 22298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &str); 22308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 22318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 22348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_country - Control country code 22358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 22368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 22378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL 22388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 22398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "Country" property. 22408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 22418d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_setter_country(DBusMessage *message, 22428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 22438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 22448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 22458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *country; 22468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_simple_property_setter(message, DBUS_TYPE_STRING, 22488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &country); 22498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply) 22508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 22518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!country[0] || !country[1]) 22538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_error_invalid_args(message, 22548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "invalid country code"); 22558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->drv_priv != NULL && wpa_drv_set_country(wpa_s, country)) { 22578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "Failed to set country"); 22588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_error_invalid_args( 22598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "failed to set country code"); 22608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->conf->country[0] = country[0]; 22638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->conf->country[1] = country[1]; 22648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 22658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 22668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 22698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ifname - Get interface name 22708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 22718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 22728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing a name of network interface 22738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * associated with with wpa_s 22748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 22758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Ifname" property. 22768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 22778d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_ifname(DBusMessage *message, 22788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 22798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 22808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *ifname = wpa_s->ifname; 22818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_simple_property_getter(message, DBUS_TYPE_STRING, 22828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &ifname); 22838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 22848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 22878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_driver - Get interface name 22888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 22898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 22908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing a name of network interface 22918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * driver associated with with wpa_s 22928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 22938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Driver" property. 22948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 22958d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_driver(DBusMessage *message, 22968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 22978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 22988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *driver; 22998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->driver == NULL || wpa_s->driver->name == NULL) { 23018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "wpas_dbus_getter_driver[dbus]: " 23028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa_s has no driver set"); 23038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_error_unknown_error(message, NULL); 23048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 23058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt driver = wpa_s->driver->name; 23078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_simple_property_getter(message, DBUS_TYPE_STRING, 23088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &driver); 23098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 23108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 23138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_bss - Get current bss object path 23148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 23158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 23168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing a DBus object path to 23178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * current BSS 23188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 23198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentBSS" property. 23208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 23218d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_current_bss(DBusMessage *message, 23228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 23238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 23248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply; 23258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *bss_obj_path = path_buf; 23268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->current_bss) 23288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, 23298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u", 23308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, wpa_s->current_bss->id); 23318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 23328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/"); 23338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_simple_property_getter(message, 23358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_OBJECT_PATH, 23368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &bss_obj_path); 23378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 23398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 23408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 23438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_network - Get current network object path 23448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 23458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 23468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing a DBus object path to 23478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * current network 23488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 23498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentNetwork" property. 23508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 23518d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_current_network(DBusMessage *message, 23528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 23538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 23548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply; 23558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *net_obj_path = path_buf; 23568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->current_ssid) 23588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, 23598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u", 23608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, wpa_s->current_ssid->id); 23618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 23628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/"); 23638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_simple_property_getter(message, 23658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_OBJECT_PATH, 23668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &net_obj_path); 23678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 23698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 23708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 23738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_auth_mode - Get current authentication type 23748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 23758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 23768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing a string indicating the current 23778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * authentication type. 23788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 23798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentAuthMode" property. 23808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 23818d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_current_auth_mode(DBusMessage *message, 23828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 23838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 23848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply; 23858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *eap_mode; 23868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *auth_mode; 23878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char eap_mode_buf[WPAS_DBUS_AUTH_MODE_MAX]; 23888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->wpa_state != WPA_COMPLETED) { 23908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt auth_mode = "INACTIVE"; 23918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X || 23928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) { 23938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eap_mode = wpa_supplicant_get_eap_mode(wpa_s); 23948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(eap_mode_buf, WPAS_DBUS_AUTH_MODE_MAX, 23958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "EAP-%s", eap_mode); 23968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt auth_mode = eap_mode_buf; 23978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 23998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt auth_mode = wpa_key_mgmt_txt(wpa_s->key_mgmt, 24008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->current_ssid->proto); 24018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_simple_property_getter(message, 24048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_STRING, 24058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &auth_mode); 24068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 24088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 24098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 24128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bridge_ifname - Get interface name 24138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 24148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 24158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing a name of bridge network 24168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * interface associated with with wpa_s 24178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 24188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BridgeIfname" property. 24198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 24208d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_bridge_ifname(DBusMessage *message, 24218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 24228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 24238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *bridge_ifname = NULL; 24248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bridge_ifname = wpa_s->bridge_ifname; 24268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bridge_ifname == NULL) { 24278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "wpas_dbus_getter_bridge_ifname[dbus]: " 24288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa_s has no bridge interface name set"); 24298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_error_unknown_error(message, NULL); 24308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_simple_property_getter(message, DBUS_TYPE_STRING, 24338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &bridge_ifname); 24348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 24358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 24388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bsss - Get array of BSSs objects 24398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 24408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 24418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing an array of all known BSS objects 24428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * dbus paths 24438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 24448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSs" property. 24458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 24468d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_bsss(DBusMessage *message, 24478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 24488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 24498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 24508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_bss *bss; 24518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **paths; 24528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int i = 0; 24538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt paths = os_zalloc(wpa_s->num_bss * sizeof(char *)); 24558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!paths) { 24568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 24578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 24588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Loop through scan results and append each result's object path */ 24618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dl_list_for_each(bss, &wpa_s->bss_id, struct wpa_bss, list_id) { 24628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX); 24638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (paths[i] == NULL) { 24648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, 24658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_ERROR_NO_MEMORY, 24668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 24678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 24688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Construct the object path for this BSS. */ 24708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX, 24718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u", 24728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, bss->id); 24738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_simple_array_property_getter(message, 24768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_OBJECT_PATH, 24778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt paths, wpa_s->num_bss); 24788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 24808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (i) 24818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths[--i]); 24828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths); 24838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 24848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 24858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 24888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_networks - Get array of networks objects 24898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 24908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 24918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing an array of all configured 24928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * networks dbus object paths. 24938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 24948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Networks" property. 24958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 24968d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_networks(DBusMessage *message, 24978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 24988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 24998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 25008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 25018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **paths; 25028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int i = 0, num = 0; 25038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->conf == NULL) { 25058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "wpas_dbus_getter_networks[dbus]: " 25068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "An error occurred getting networks list."); 25078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_error_unknown_error(message, NULL); 25088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) 251175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!network_is_persistent_group(ssid)) 251275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen num++; 25138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt paths = os_zalloc(num * sizeof(char *)); 25158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!paths) { 25168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 25178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 25188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Loop through configured networks and append object path of each */ 25218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) { 252275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (network_is_persistent_group(ssid)) 252375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen continue; 25248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX); 25258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (paths[i] == NULL) { 25268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, 25278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_ERROR_NO_MEMORY, 25288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 25298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 25308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Construct the object path for this network. */ 25338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX, 25348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d", 25358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, ssid->id); 25368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_simple_array_property_getter(message, 25398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_OBJECT_PATH, 25408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt paths, num); 25418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 25438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (i) 25448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths[--i]); 25458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths); 25468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 25478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 25488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 25518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_blobs - Get all blobs defined for this interface 25528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 25538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 25548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing a dictionary of pairs (blob_name, blob) 25558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 25568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Blobs" property. 25578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 25588d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_blobs(DBusMessage *message, 25598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 25608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 25618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 25628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, variant_iter, dict_iter, entry_iter, array_iter; 25638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_config_blob *blob; 25648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (message == NULL) 25668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new(DBUS_MESSAGE_TYPE_SIGNAL); 25678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 25688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 25698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!reply) 25708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 25718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 25728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init_append(reply, &iter); 25748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT, 25768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "a{say}", &variant_iter) || 25778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY, 25788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "{say}", &dict_iter)) { 25798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 25808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 25818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 25828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = wpa_s->conf->blobs; 25858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (blob) { 25868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_open_container(&dict_iter, 25878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_DICT_ENTRY, 25888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL, &entry_iter) || 25898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_append_basic(&entry_iter, 25908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_STRING, 25918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &(blob->name)) || 25928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_open_container(&entry_iter, 25938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_ARRAY, 25948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_BYTE_AS_STRING, 25958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &array_iter) || 25968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_append_fixed_array(&array_iter, 25978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_BYTE, 25988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &(blob->data), 25998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->len) || 26008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_close_container(&entry_iter, 26018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &array_iter) || 26028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_close_container(&dict_iter, 26038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &entry_iter)) { 26048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 26058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, 26068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_ERROR_NO_MEMORY, 26078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 26088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = blob->next; 26118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_close_container(&variant_iter, &dict_iter) || 26148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_close_container(&iter, &variant_iter)) { 26158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 26168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 26178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 26188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 26218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 26228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 26258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_bssid - Return the BSSID of a BSS 26268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 26278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @bss: a pair of interface describing structure and bss's id 26288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing the bssid for the requested bss 26298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 26308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSID" property. 26318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 26328d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_bss_bssid(DBusMessage *message, 26338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct bss_handler_args *bss) 26348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 26358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_bss *res = wpa_bss_get_id(bss->wpa_s, bss->id); 26368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!res) { 26388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "wpas_dbus_getter_bss_bssid[dbus]: no " 26398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "bss with id %d found", bss->id); 26408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 26418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_simple_array_property_getter(message, DBUS_TYPE_BYTE, 26448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res->bssid, ETH_ALEN); 26458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 26468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 26498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ssid - Return the SSID of a BSS 26508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 26518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @bss: a pair of interface describing structure and bss's id 26528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing the ssid for the requested bss 26538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 26548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "SSID" property. 26558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 26568d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_bss_ssid(DBusMessage *message, 26578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct bss_handler_args *bss) 26588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 26598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_bss *res = wpa_bss_get_id(bss->wpa_s, bss->id); 26608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!res) { 26628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "wpas_dbus_getter_bss_ssid[dbus]: no " 26638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "bss with id %d found", bss->id); 26648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 26658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_simple_array_property_getter(message, DBUS_TYPE_BYTE, 26688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res->ssid, 26698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res->ssid_len); 26708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 26718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 26748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_privacy - Return the privacy flag of a BSS 26758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 26768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @bss: a pair of interface describing structure and bss's id 26778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing the privacy flag value of requested bss 26788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 26798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Privacy" property. 26808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 26818d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_bss_privacy(DBusMessage *message, 26828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct bss_handler_args *bss) 26838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 26848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_bss *res = wpa_bss_get_id(bss->wpa_s, bss->id); 26858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t privacy; 26868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!res) { 26888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "wpas_dbus_getter_bss_privacy[dbus]: no " 26898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "bss with id %d found", bss->id); 26908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 26918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt privacy = (res->caps & IEEE80211_CAP_PRIVACY) ? TRUE : FALSE; 26948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_simple_property_getter(message, DBUS_TYPE_BOOLEAN, 26958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &privacy); 26968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 26978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 27008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_mode - Return the mode of a BSS 27018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 27028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @bss: a pair of interface describing structure and bss's id 27038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing the mode of requested bss 27048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 27058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Mode" property. 27068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 27078d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_bss_mode(DBusMessage *message, 27088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct bss_handler_args *bss) 27098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 27108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_bss *res = wpa_bss_get_id(bss->wpa_s, bss->id); 27118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *mode; 27128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!res) { 27148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "wpas_dbus_getter_bss_mode[dbus]: no " 27158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "bss with id %d found", bss->id); 27168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 27178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 27188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res->caps & IEEE80211_CAP_IBSS) 27208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mode = "ad-hoc"; 27218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 27228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mode = "infrastructure"; 27238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_simple_property_getter(message, DBUS_TYPE_STRING, 27258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &mode); 27268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 27308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_level - Return the signal strength of a BSS 27318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 27328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @bss: a pair of interface describing structure and bss's id 27338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing the signal strength of requested bss 27348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 27358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Level" property. 27368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 27378d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_bss_signal(DBusMessage *message, 27388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct bss_handler_args *bss) 27398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 27408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_bss *res = wpa_bss_get_id(bss->wpa_s, bss->id); 27418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!res) { 27438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "wpas_dbus_getter_bss_signal[dbus]: no " 27448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "bss with id %d found", bss->id); 27458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 27468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 27478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_simple_property_getter(message, DBUS_TYPE_INT16, 27498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &res->level); 27508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 27548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_frequency - Return the frequency of a BSS 27558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 27568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @bss: a pair of interface describing structure and bss's id 27578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing the frequency of requested bss 27588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 27598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Frequency" property. 27608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 27618d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_bss_frequency(DBusMessage *message, 27628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct bss_handler_args *bss) 27638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 27648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_bss *res = wpa_bss_get_id(bss->wpa_s, bss->id); 27658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!res) { 27678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "wpas_dbus_getter_bss_frequency[dbus]: " 27688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "no bss with id %d found", bss->id); 27698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 27708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 27718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_simple_property_getter(message, DBUS_TYPE_UINT16, 27738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &res->freq); 27748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int cmp_u8s_desc(const void *a, const void *b) 27788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 27798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return (*(u8 *) b - *(u8 *) a); 27808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 27848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rates - Return available bit rates of a BSS 27858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 27868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @bss: a pair of interface describing structure and bss's id 27878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing sorted array of bit rates 27888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 27898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Rates" property. 27908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 27918d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_bss_rates(DBusMessage *message, 27928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct bss_handler_args *bss) 27938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 27948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply; 27958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_bss *res = wpa_bss_get_id(bss->wpa_s, bss->id); 27968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *ie_rates = NULL; 27978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u32 *real_rates; 27988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int rates_num, i; 27998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!res) { 28018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "wpas_dbus_getter_bss_rates[dbus]: " 28028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "no bss with id %d found", bss->id); 28038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 28048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 28058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt rates_num = wpa_bss_get_bit_rates(res, &ie_rates); 28078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (rates_num < 0) 28088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 28098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt qsort(ie_rates, rates_num, 1, cmp_u8s_desc); 28118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt real_rates = os_malloc(sizeof(u32) * rates_num); 28138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!real_rates) { 28148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ie_rates); 28158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 28168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 28178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 28188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < rates_num; i++) 28208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt real_rates[i] = ie_rates[i] * 500000; 28218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_simple_array_property_getter(message, 28238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_UINT32, 28248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt real_rates, rates_num); 28258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ie_rates); 28278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(real_rates); 28288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 28298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 28308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic DBusMessage * wpas_dbus_get_bss_security_prop( 28338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *message, struct wpa_ie_data *ie_data) 28348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 28358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply; 28368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, iter_dict, variant_iter; 28378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *group; 28388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *pairwise[2]; /* max 2 pairwise ciphers is supported */ 28398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *key_mgmt[7]; /* max 7 key managements may be supported */ 28408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int n; 28418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (message == NULL) 28438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new(DBUS_MESSAGE_TYPE_SIGNAL); 28448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 28458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 28468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!reply) 28478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 28488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init_append(reply, &iter); 28508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT, 28518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "a{sv}", &variant_iter)) 28528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 28538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict)) 28558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 28568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* KeyMgmt */ 28588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt n = 0; 28598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK) 28608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-psk"; 28618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_PSK) 28628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-ft-psk"; 28638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK_SHA256) 28648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-psk-sha256"; 28658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X) 28668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-eap"; 28678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X) 28688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-ft-eap"; 28698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256) 28708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-eap-sha256"; 28718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_NONE) 28728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-none"; 28738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array(&iter_dict, "KeyMgmt", 28758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt, n)) 28768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 28778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Group */ 28798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (ie_data->group_cipher) { 28808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_WEP40: 28818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "wep40"; 28828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 28838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_TKIP: 28848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "tkip"; 28858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 28868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_CCMP: 28878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "ccmp"; 28888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 28898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_WEP104: 28908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "wep104"; 28918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 28928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 28938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = ""; 28948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 28958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 28968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string(&iter_dict, "Group", group)) 28988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 28998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Pairwise */ 29018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt n = 0; 29028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_TKIP) 29038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pairwise[n++] = "tkip"; 29048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_CCMP) 29058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pairwise[n++] = "ccmp"; 29068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array(&iter_dict, "Pairwise", 29088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pairwise, n)) 29098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 29108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Management group (RSN only) */ 29128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->proto == WPA_PROTO_RSN) { 29138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (ie_data->mgmt_group_cipher) { 29148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 29158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_AES_128_CMAC: 29168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "aes128cmac"; 29178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 29188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 29198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 29208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = ""; 29218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 29228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 29238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string(&iter_dict, "MgmtGroup", 29258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group)) 29268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 29278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 29288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict)) 29308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 29318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_close_container(&iter, &variant_iter)) 29328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 29338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 29358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem: 29378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply) 29388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 29398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, NULL); 29418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 29428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 29458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_wpa - Return the WPA options of a BSS 29468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 29478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @bss: a pair of interface describing structure and bss's id 29488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing the WPA options of requested bss 29498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 29508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "WPA" property. 29518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 29528d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_bss_wpa(DBusMessage *message, 29538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct bss_handler_args *bss) 29548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 29558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_bss *res = wpa_bss_get_id(bss->wpa_s, bss->id); 29568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ie_data wpa_data; 29578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *ie; 29588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!res) { 29608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "wpas_dbus_getter_bss_wpa[dbus]: no " 29618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "bss with id %d found", bss->id); 29628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 29638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 29648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&wpa_data, 0, sizeof(wpa_data)); 29668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie = wpa_bss_get_vendor_ie(res, WPA_IE_VENDOR_TYPE); 29678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie) { 29688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0) 29698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_error_unknown_error(message, 29708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "invalid WPA IE"); 29718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 29728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_get_bss_security_prop(message, &wpa_data); 29748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 29758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 29788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rsn - Return the RSN options of a BSS 29798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 29808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @bss: a pair of interface describing structure and bss's id 29818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing the RSN options of requested bss 29828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 29838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "RSN" property. 29848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 29858d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_bss_rsn(DBusMessage *message, 29868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct bss_handler_args *bss) 29878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 29888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_bss *res = wpa_bss_get_id(bss->wpa_s, bss->id); 29898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ie_data wpa_data; 29908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *ie; 29918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!res) { 29938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "wpas_dbus_getter_bss_rsn[dbus]: no " 29948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "bss with id %d found", bss->id); 29958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 29968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 29978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&wpa_data, 0, sizeof(wpa_data)); 29998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie = wpa_bss_get_ie(res, WLAN_EID_RSN); 30008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie) { 30018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0) 30028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_error_unknown_error(message, 30038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "invalid RSN IE"); 30048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 30058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_get_bss_security_prop(message, &wpa_data); 30078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 30118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ies - Return all IEs of a BSS 30128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 30138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @bss: a pair of interface describing structure and bss's id 30148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing IEs byte array 30158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 30168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "IEs" property. 30178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 30188d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_bss_ies(DBusMessage *message, 30198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct bss_handler_args *bss) 30208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_bss *res = wpa_bss_get_id(bss->wpa_s, bss->id); 30228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!res) { 30248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "wpas_dbus_getter_bss_ies[dbus]: no " 30258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "bss with id %d found", bss->id); 30268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 30278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 30288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_simple_array_property_getter(message, DBUS_TYPE_BYTE, 30308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res + 1, res->ie_len); 30318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 30358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_enabled - Check whether network is enabled or disabled 30368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 30378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpas_dbus_setter_enabled: wpa_supplicant structure for a network interface 30388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * and wpa_ssid structure for a configured network 30398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: DBus message with boolean indicating state of configured network 30408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or DBus error on failure 30418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 30428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "enabled" property of a configured network. 30438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 30448d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_enabled(DBusMessage *message, 30458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct network_handler_args *net) 30468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t enabled = net->ssid->disabled ? FALSE : TRUE; 30488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_simple_property_getter(message, DBUS_TYPE_BOOLEAN, 30498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &enabled); 30508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 30548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_enabled - Mark a configured network as enabled or disabled 30558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 30568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpas_dbus_setter_enabled: wpa_supplicant structure for a network interface 30578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * and wpa_ssid structure for a configured network 30588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL indicating success or DBus error on failure 30598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 30608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Enabled" property of a configured network. 30618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 30628d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_setter_enabled(DBusMessage *message, 30638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct network_handler_args *net) 30648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 30668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 30688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 30698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t enable; 30718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_simple_property_setter(message, DBUS_TYPE_BOOLEAN, 30738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &enable); 30748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply) 30768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 30778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s = net->wpa_s; 30798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = net->ssid; 30808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (enable) 30828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_enable_network(wpa_s, ssid); 30838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 30848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_disable_network(wpa_s, ssid); 30858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 30878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 30918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_network_properties - Get options for a configured network 30928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 30938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @net: wpa_supplicant structure for a network interface and 30948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_ssid structure for a configured network 30958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: DBus message with network properties or DBus error on failure 30968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 30978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Properties" property of a configured network. 30988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 30998d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_network_properties( 31008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *message, struct network_handler_args *net) 31018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 31038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, variant_iter, dict_iter; 31048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **iterator; 31058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **props = wpa_config_get_all(net->ssid, 1); 31068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!props) 31078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 31088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 31098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (message == NULL) 31118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new(DBUS_MESSAGE_TYPE_SIGNAL); 31128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 31138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 31148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!reply) { 31158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 31168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 31178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 31188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 31198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init_append(reply, &iter); 31218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT, 31238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "a{sv}", &variant_iter) || 31248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !wpa_dbus_dict_open_write(&variant_iter, &dict_iter)) { 31258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 31268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 31278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 31288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 31298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 31308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator = props; 31328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*iterator) { 31338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string(&dict_iter, *iterator, 31348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *(iterator + 1))) { 31358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 31368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, 31378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_ERROR_NO_MEMORY, 31388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 31398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 31408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 31418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator += 2; 31428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 31438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_close_write(&variant_iter, &dict_iter) || 31468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_close_container(&iter, &variant_iter)) { 31478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 31488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, 31498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 31508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 31518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 31528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 31548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator = props; 31558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*iterator) { 31568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(*iterator); 31578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator++; 31588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 31598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(props); 31608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 31618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 31658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_network_properties - Set options for a configured network 31668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 31678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @net: wpa_supplicant structure for a network interface and 31688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_ssid structure for a configured network 31698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL indicating success or DBus error on failure 31708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 31718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Properties" property of a configured network. 31728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 31738d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_setter_network_properties( 31748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *message, struct network_handler_args *net) 31758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid = net->ssid; 31778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 31798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, variant_iter; 31808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 31828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&iter); 31848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&iter); 31858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&iter, &variant_iter); 31878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = set_network_properties(message, net->wpa_s, ssid, 31898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &variant_iter); 31908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply) 31918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "dbus control interface couldn't set " 31928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "network properties"); 31938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 31958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3196