16a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius/* 26a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius * hidl interface for wpa_supplicant daemon 36a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius * Copyright (struct wpa_supplicant* wpa_s, c) 2004-2016, Jouni Malinen 46a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius * <j@w1.fi> 56a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius * Copyright (struct wpa_supplicant* wpa_s, c) 2004-2016, Roshan Pius 66a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius * <rpius@google.com> 76a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius * 86a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius * This software may be distributed under the terms of the BSD license. 96a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius * See README for more details. 106a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius */ 116a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 126a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius#include "hidl_manager.h" 136a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius#include "hidl_return_util.h" 146a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius#include "iface_config_utils.h" 156a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 166a12d323192f549ce80c40c06dc3c169b61709fdRoshan Piusnamespace { 176a12d323192f549ce80c40c06dc3c169b61709fdRoshan Piusconstexpr uint32_t kMaxWpsDeviceNameSize = WPS_DEV_NAME_MAX_LEN; 188d851200b8e02c830076099a3aec31ff3ae47133Roshan Piusconstexpr uint32_t kMaxWpsManufacturerSize = WPS_MANUFACTURER_MAX_LEN; 198d851200b8e02c830076099a3aec31ff3ae47133Roshan Piusconstexpr uint32_t kMaxWpsModelNameSize = WPS_MODEL_NAME_MAX_LEN; 208d851200b8e02c830076099a3aec31ff3ae47133Roshan Piusconstexpr uint32_t kMaxWpsModelNumberSize = WPS_MODEL_NUMBER_MAX_LEN; 218d851200b8e02c830076099a3aec31ff3ae47133Roshan Piusconstexpr uint32_t kMaxWpsSerialNumberSize = WPS_SERIAL_NUMBER_MAX_LEN; 226a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 2394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piusvoid processConfigUpdate(struct wpa_supplicant* wpa_s, uint32_t changed_param) 2494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{ 2594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius wpa_s->conf->changed_parameters |= changed_param; 2694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius wpa_supplicant_update_config(wpa_s); 2794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius} 2894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 296a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius// Free any existing pointer stored in |dst| and store the provided string value 306a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius// there. 316a12d323192f549ce80c40c06dc3c169b61709fdRoshan Piusint freeAndSetStringConfigParam( 3294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius struct wpa_supplicant* wpa_s, const std::string& value, uint32_t max_size, 336a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius uint32_t changed_param, char** dst) 346a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 356a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius if (value.size() > max_size) { 366a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return -1; 376a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius } 386a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius WPA_ASSERT(dst); 396a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius os_free(static_cast<void*>(*dst)); 406a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius *dst = os_strdup(value.c_str()); 4194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius processConfigUpdate(wpa_s, changed_param); 426a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return 0; 436a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 446a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 456a12d323192f549ce80c40c06dc3c169b61709fdRoshan Piusstd::string convertWpsConfigMethodsMaskToString(uint16_t config_methods) 466a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 476a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius using WpsConfigMethods = 486a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius android::hardware::wifi::supplicant::V1_0::WpsConfigMethods; 496a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius std::string config_methods_str; 506a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius for (const auto& flag_and_name : 516a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius {std::make_pair(WpsConfigMethods::USBA, "usba"), 526a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius {WpsConfigMethods::ETHERNET, "ethernet"}, 536a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius {WpsConfigMethods::LABEL, "label"}, 546a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius {WpsConfigMethods::DISPLAY, "display"}, 556a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius {WpsConfigMethods::INT_NFC_TOKEN, "int_nfc_token"}, 566a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius {WpsConfigMethods::EXT_NFC_TOKEN, "ext_nfc_token"}, 576a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius {WpsConfigMethods::NFC_INTERFACE, "nfc_interface"}, 58b114a6138b9fad2c4c614f821dff8cd066797e94Roshan Pius {WpsConfigMethods::PUSHBUTTON, "push_button"}, 596a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius {WpsConfigMethods::KEYPAD, "keypad"}, 60b114a6138b9fad2c4c614f821dff8cd066797e94Roshan Pius {WpsConfigMethods::VIRT_PUSHBUTTON, "virtual_push_button"}, 61b114a6138b9fad2c4c614f821dff8cd066797e94Roshan Pius {WpsConfigMethods::PHY_PUSHBUTTON, "physical_push_button"}, 626a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius {WpsConfigMethods::P2PS, "p2ps"}, 63b114a6138b9fad2c4c614f821dff8cd066797e94Roshan Pius {WpsConfigMethods::VIRT_DISPLAY, "virtual_display"}, 64b114a6138b9fad2c4c614f821dff8cd066797e94Roshan Pius {WpsConfigMethods::PHY_DISPLAY, "physical_display"}}) { 65a4f38dba0146b8057c2a403991e099e0ad4ed62dRoshan Pius const auto flag = 66a4f38dba0146b8057c2a403991e099e0ad4ed62dRoshan Pius static_cast<std::underlying_type<WpsConfigMethods>::type>( 67a4f38dba0146b8057c2a403991e099e0ad4ed62dRoshan Pius flag_and_name.first); 68a4f38dba0146b8057c2a403991e099e0ad4ed62dRoshan Pius if ((config_methods & flag) == flag) { 696a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius config_methods_str += flag_and_name.second; 706a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius config_methods_str += " "; 716a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius } 726a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius } 736a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return config_methods_str; 746a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 756a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} // namespace 766a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 776a12d323192f549ce80c40c06dc3c169b61709fdRoshan Piusnamespace android { 786a12d323192f549ce80c40c06dc3c169b61709fdRoshan Piusnamespace hardware { 796a12d323192f549ce80c40c06dc3c169b61709fdRoshan Piusnamespace wifi { 806a12d323192f549ce80c40c06dc3c169b61709fdRoshan Piusnamespace supplicant { 816a12d323192f549ce80c40c06dc3c169b61709fdRoshan Piusnamespace V1_0 { 826a12d323192f549ce80c40c06dc3c169b61709fdRoshan Piusnamespace implementation { 836a12d323192f549ce80c40c06dc3c169b61709fdRoshan Piusnamespace iface_config_utils { 846a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusSupplicantStatus setWpsDeviceName( 856a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius struct wpa_supplicant* wpa_s, const std::string& name) 866a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 876a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius WPA_ASSERT(wpa_s); 886a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius if (freeAndSetStringConfigParam( 896a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius wpa_s, name, kMaxWpsDeviceNameSize, CFG_CHANGED_DEVICE_NAME, 906a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius &wpa_s->conf->device_name)) { 916a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return {SupplicantStatusCode::FAILURE_ARGS_INVALID, ""}; 926a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius } 936a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 946a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 956a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 9694426e651275a0ef2261783b7eb13aa64012bbc8Roshan PiusSupplicantStatus setWpsDeviceType( 9794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius struct wpa_supplicant* wpa_s, const std::array<uint8_t, 8>& type) 9894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{ 9994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius WPA_ASSERT(wpa_s); 10094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius WPA_ASSERT(type.size() == WPS_DEV_TYPE_LEN); 10194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius os_memcpy(wpa_s->conf->device_type, type.data(), WPS_DEV_TYPE_LEN); 10294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius processConfigUpdate(wpa_s, CFG_CHANGED_DEVICE_TYPE); 10394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 10494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius} 10594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 1066a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusSupplicantStatus setWpsManufacturer( 1076a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius struct wpa_supplicant* wpa_s, const std::string& manufacturer) 1086a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 1096a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius WPA_ASSERT(wpa_s); 1106a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius if (freeAndSetStringConfigParam( 1116a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius wpa_s, manufacturer, kMaxWpsManufacturerSize, 1126a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius CFG_CHANGED_WPS_STRING, &wpa_s->conf->manufacturer)) { 1136a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return {SupplicantStatusCode::FAILURE_ARGS_INVALID, ""}; 1146a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius } 1156a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 1166a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 1176a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 1186a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusSupplicantStatus setWpsModelName( 1196a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius struct wpa_supplicant* wpa_s, const std::string& model_name) 1206a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 1216a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius WPA_ASSERT(wpa_s); 1226a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius if (freeAndSetStringConfigParam( 1236a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius wpa_s, model_name, kMaxWpsModelNameSize, CFG_CHANGED_WPS_STRING, 1246a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius &wpa_s->conf->model_name)) { 1256a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return {SupplicantStatusCode::FAILURE_ARGS_INVALID, ""}; 1266a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius } 1276a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 1286a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 1296a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 1306a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusSupplicantStatus setWpsModelNumber( 1316a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius struct wpa_supplicant* wpa_s, const std::string& model_number) 1326a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 1336a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius WPA_ASSERT(wpa_s); 1346a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius if (freeAndSetStringConfigParam( 1356a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius wpa_s, model_number, kMaxWpsModelNumberSize, 1366a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius CFG_CHANGED_WPS_STRING, &wpa_s->conf->model_number)) { 1376a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return {SupplicantStatusCode::FAILURE_ARGS_INVALID, ""}; 1386a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius } 1396a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 1406a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 1416a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 1426a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusSupplicantStatus setWpsSerialNumber( 1436a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius struct wpa_supplicant* wpa_s, const std::string& serial_number) 1446a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 1456a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius WPA_ASSERT(wpa_s); 1466a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius if (freeAndSetStringConfigParam( 1476a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius wpa_s, serial_number, kMaxWpsSerialNumberSize, 1486a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius CFG_CHANGED_WPS_STRING, &wpa_s->conf->serial_number)) { 1496a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return {SupplicantStatusCode::FAILURE_ARGS_INVALID, ""}; 1506a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius } 1516a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 1526a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 1536a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 1546a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusSupplicantStatus setWpsConfigMethods( 1556a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius struct wpa_supplicant* wpa_s, uint16_t config_methods) 1566a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 1576a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius WPA_ASSERT(wpa_s); 1586a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius if (freeAndSetStringConfigParam( 1596a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius wpa_s, convertWpsConfigMethodsMaskToString(config_methods), 1606a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius UINT32_MAX, CFG_CHANGED_CONFIG_METHODS, 1616a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius &wpa_s->conf->config_methods)) { 1626a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return {SupplicantStatusCode::FAILURE_ARGS_INVALID, ""}; 1636a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius } 1646a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 1656a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 1666a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 1676a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusSupplicantStatus setExternalSim( 1686a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius struct wpa_supplicant* wpa_s, bool useExternalSim) 1696a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 1706a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius WPA_ASSERT(wpa_s); 1716a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius wpa_s->conf->external_sim = useExternalSim ? 1 : 0; 1726a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 1736a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 1746a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} // namespace iface_config_utils 1756a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} // namespace implementation 1766a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} // namespace V1_0 1776a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} // namespace wifi 1786a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} // namespace supplicant 1796a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} // namespace hardware 1806a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} // namespace android 181