1/*
2 * hidl interface for wpa_supplicant daemon
3 * Copyright (struct wpa_supplicant* wpa_s, c) 2004-2016, Jouni Malinen
4 * <j@w1.fi>
5 * Copyright (struct wpa_supplicant* wpa_s, c) 2004-2016, Roshan Pius
6 * <rpius@google.com>
7 *
8 * This software may be distributed under the terms of the BSD license.
9 * See README for more details.
10 */
11
12#include "hidl_manager.h"
13#include "hidl_return_util.h"
14#include "iface_config_utils.h"
15
16namespace {
17constexpr uint32_t kMaxWpsDeviceNameSize = WPS_DEV_NAME_MAX_LEN;
18constexpr uint32_t kMaxWpsManufacturerSize = WPS_MANUFACTURER_MAX_LEN;
19constexpr uint32_t kMaxWpsModelNameSize = WPS_MODEL_NAME_MAX_LEN;
20constexpr uint32_t kMaxWpsModelNumberSize = WPS_MODEL_NUMBER_MAX_LEN;
21constexpr uint32_t kMaxWpsSerialNumberSize = WPS_SERIAL_NUMBER_MAX_LEN;
22
23void processConfigUpdate(struct wpa_supplicant* wpa_s, uint32_t changed_param)
24{
25	wpa_s->conf->changed_parameters |= changed_param;
26	wpa_supplicant_update_config(wpa_s);
27}
28
29// Free any existing pointer stored in |dst| and store the provided string value
30// there.
31int freeAndSetStringConfigParam(
32    struct wpa_supplicant* wpa_s, const std::string& value, uint32_t max_size,
33    uint32_t changed_param, char** dst)
34{
35	if (value.size() > max_size) {
36		return -1;
37	}
38	WPA_ASSERT(dst);
39	os_free(static_cast<void*>(*dst));
40	*dst = os_strdup(value.c_str());
41	processConfigUpdate(wpa_s, changed_param);
42	return 0;
43}
44
45std::string convertWpsConfigMethodsMaskToString(uint16_t config_methods)
46{
47	using WpsConfigMethods =
48	    android::hardware::wifi::supplicant::V1_0::WpsConfigMethods;
49	std::string config_methods_str;
50	for (const auto& flag_and_name :
51	     {std::make_pair(WpsConfigMethods::USBA, "usba"),
52	      {WpsConfigMethods::ETHERNET, "ethernet"},
53	      {WpsConfigMethods::LABEL, "label"},
54	      {WpsConfigMethods::DISPLAY, "display"},
55	      {WpsConfigMethods::INT_NFC_TOKEN, "int_nfc_token"},
56	      {WpsConfigMethods::EXT_NFC_TOKEN, "ext_nfc_token"},
57	      {WpsConfigMethods::NFC_INTERFACE, "nfc_interface"},
58	      {WpsConfigMethods::PUSHBUTTON, "push_button"},
59	      {WpsConfigMethods::KEYPAD, "keypad"},
60	      {WpsConfigMethods::VIRT_PUSHBUTTON, "virtual_push_button"},
61	      {WpsConfigMethods::PHY_PUSHBUTTON, "physical_push_button"},
62	      {WpsConfigMethods::P2PS, "p2ps"},
63	      {WpsConfigMethods::VIRT_DISPLAY, "virtual_display"},
64	      {WpsConfigMethods::PHY_DISPLAY, "physical_display"}}) {
65		const auto flag =
66		    static_cast<std::underlying_type<WpsConfigMethods>::type>(
67			flag_and_name.first);
68		if ((config_methods & flag) == flag) {
69			config_methods_str += flag_and_name.second;
70			config_methods_str += " ";
71		}
72	}
73	return config_methods_str;
74}
75}  // namespace
76
77namespace android {
78namespace hardware {
79namespace wifi {
80namespace supplicant {
81namespace V1_1 {
82namespace implementation {
83namespace iface_config_utils {
84SupplicantStatus setWpsDeviceName(
85    struct wpa_supplicant* wpa_s, const std::string& name)
86{
87	WPA_ASSERT(wpa_s);
88	if (freeAndSetStringConfigParam(
89		wpa_s, name, kMaxWpsDeviceNameSize, CFG_CHANGED_DEVICE_NAME,
90		&wpa_s->conf->device_name)) {
91		return {SupplicantStatusCode::FAILURE_ARGS_INVALID, ""};
92	}
93	return {SupplicantStatusCode::SUCCESS, ""};
94}
95
96SupplicantStatus setWpsDeviceType(
97    struct wpa_supplicant* wpa_s, const std::array<uint8_t, 8>& type)
98{
99	WPA_ASSERT(wpa_s);
100	WPA_ASSERT(type.size() == WPS_DEV_TYPE_LEN);
101	os_memcpy(wpa_s->conf->device_type, type.data(), WPS_DEV_TYPE_LEN);
102	processConfigUpdate(wpa_s, CFG_CHANGED_DEVICE_TYPE);
103	return {SupplicantStatusCode::SUCCESS, ""};
104}
105
106SupplicantStatus setWpsManufacturer(
107    struct wpa_supplicant* wpa_s, const std::string& manufacturer)
108{
109	WPA_ASSERT(wpa_s);
110	if (freeAndSetStringConfigParam(
111		wpa_s, manufacturer, kMaxWpsManufacturerSize,
112		CFG_CHANGED_WPS_STRING, &wpa_s->conf->manufacturer)) {
113		return {SupplicantStatusCode::FAILURE_ARGS_INVALID, ""};
114	}
115	return {SupplicantStatusCode::SUCCESS, ""};
116}
117
118SupplicantStatus setWpsModelName(
119    struct wpa_supplicant* wpa_s, const std::string& model_name)
120{
121	WPA_ASSERT(wpa_s);
122	if (freeAndSetStringConfigParam(
123		wpa_s, model_name, kMaxWpsModelNameSize, CFG_CHANGED_WPS_STRING,
124		&wpa_s->conf->model_name)) {
125		return {SupplicantStatusCode::FAILURE_ARGS_INVALID, ""};
126	}
127	return {SupplicantStatusCode::SUCCESS, ""};
128}
129
130SupplicantStatus setWpsModelNumber(
131    struct wpa_supplicant* wpa_s, const std::string& model_number)
132{
133	WPA_ASSERT(wpa_s);
134	if (freeAndSetStringConfigParam(
135		wpa_s, model_number, kMaxWpsModelNumberSize,
136		CFG_CHANGED_WPS_STRING, &wpa_s->conf->model_number)) {
137		return {SupplicantStatusCode::FAILURE_ARGS_INVALID, ""};
138	}
139	return {SupplicantStatusCode::SUCCESS, ""};
140}
141
142SupplicantStatus setWpsSerialNumber(
143    struct wpa_supplicant* wpa_s, const std::string& serial_number)
144{
145	WPA_ASSERT(wpa_s);
146	if (freeAndSetStringConfigParam(
147		wpa_s, serial_number, kMaxWpsSerialNumberSize,
148		CFG_CHANGED_WPS_STRING, &wpa_s->conf->serial_number)) {
149		return {SupplicantStatusCode::FAILURE_ARGS_INVALID, ""};
150	}
151	return {SupplicantStatusCode::SUCCESS, ""};
152}
153
154SupplicantStatus setWpsConfigMethods(
155    struct wpa_supplicant* wpa_s, uint16_t config_methods)
156{
157	WPA_ASSERT(wpa_s);
158	if (freeAndSetStringConfigParam(
159		wpa_s, convertWpsConfigMethodsMaskToString(config_methods),
160		UINT32_MAX, CFG_CHANGED_CONFIG_METHODS,
161		&wpa_s->conf->config_methods)) {
162		return {SupplicantStatusCode::FAILURE_ARGS_INVALID, ""};
163	}
164	return {SupplicantStatusCode::SUCCESS, ""};
165}
166
167SupplicantStatus setExternalSim(
168    struct wpa_supplicant* wpa_s, bool useExternalSim)
169{
170	WPA_ASSERT(wpa_s);
171	wpa_s->conf->external_sim = useExternalSim ? 1 : 0;
172	return {SupplicantStatusCode::SUCCESS, ""};
173}
174}  // namespace iface_config_utils
175}  // namespace implementation
176}  // namespace V1_1
177}  // namespace wifi
178}  // namespace supplicant
179}  // namespace hardware
180}  // namespace android
181