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