• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * WPA Supplicant - P2P Iface Aidl interface
3  * Copyright (c) 2021, Google Inc. All rights reserved.
4  *
5  * This software may be distributed under the terms of the BSD license.
6  * See README for more details.
7  */
8 
9 #ifndef WPA_SUPPLICANT_AIDL_P2P_IFACE_H
10 #define WPA_SUPPLICANT_AIDL_P2P_IFACE_H
11 
12 #include <array>
13 #include <vector>
14 
15 #include <android-base/macros.h>
16 
17 #include <aidl/android/hardware/wifi/supplicant/BnSupplicantP2pIface.h>
18 #include <aidl/android/hardware/wifi/supplicant/FreqRange.h>
19 #include <aidl/android/hardware/wifi/supplicant/ISupplicantP2pIfaceCallback.h>
20 #include <aidl/android/hardware/wifi/supplicant/ISupplicantP2pNetwork.h>
21 #include <aidl/android/hardware/wifi/supplicant/MiracastMode.h>
22 #include <aidl/android/hardware/wifi/supplicant/P2pPairingBootstrappingMethodMask.h>
23 #include <aidl/android/hardware/wifi/supplicant/WpsProvisionMethod.h>
24 
25 extern "C"
26 {
27 #include "utils/common.h"
28 #include "utils/includes.h"
29 #include "p2p/p2p.h"
30 #include "p2p/p2p_i.h"
31 #include "p2p_supplicant.h"
32 #include "p2p_supplicant.h"
33 #include "config.h"
34 }
35 
36 #define P2P_MGMT_DEVICE_PREFIX	   "p2p-dev-"
37 
38 namespace aidl {
39 namespace android {
40 namespace hardware {
41 namespace wifi {
42 namespace supplicant {
43 
44 /**
45  * Implementation of P2pIface aidl object. Each unique aidl
46  * object is used for control operations on a specific interface
47  * controlled by wpa_supplicant.
48  */
49 class P2pIface : public BnSupplicantP2pIface
50 {
51 public:
52 	P2pIface(struct wpa_global* wpa_global, const char ifname[]);
53 	~P2pIface() override = default;
54 	// Refer to |StaIface::invalidate()|.
55 	void invalidate();
56 	bool isValid();
57 
58 	// Aidl methods exposed.
59 	::ndk::ScopedAStatus getName(std::string* _aidl_return) override;
60 	::ndk::ScopedAStatus getType(IfaceType* _aidl_return) override;
61 	::ndk::ScopedAStatus addNetwork(
62 		std::shared_ptr<ISupplicantP2pNetwork>* _aidl_return) override;
63 	::ndk::ScopedAStatus removeNetwork(int32_t in_id) override;
64 	::ndk::ScopedAStatus getNetwork(
65 		int32_t in_id, std::shared_ptr<ISupplicantP2pNetwork>* _aidl_return) override;
66 	::ndk::ScopedAStatus listNetworks(std::vector<int32_t>* _aidl_return) override;
67 	::ndk::ScopedAStatus registerCallback(
68 		const std::shared_ptr<ISupplicantP2pIfaceCallback>& in_callback) override;
69 	::ndk::ScopedAStatus getDeviceAddress(std::vector<uint8_t>* _aidl_return) override;
70 	::ndk::ScopedAStatus setSsidPostfix(const std::vector<uint8_t>& in_postfix) override;
71 	::ndk::ScopedAStatus setGroupIdle(
72 		const std::string& in_groupIfName, int32_t in_timeoutInSec) override;
73 	::ndk::ScopedAStatus setPowerSave(
74 		const std::string& in_groupIfName, bool in_enable) override;
75 	::ndk::ScopedAStatus find(int32_t in_timeoutInSec) override;
76 	::ndk::ScopedAStatus stopFind() override;
77 	::ndk::ScopedAStatus flush() override;
78 	::ndk::ScopedAStatus connect(
79 		const std::vector<uint8_t>& in_peerAddress, WpsProvisionMethod in_provisionMethod,
80 		const std::string& in_preSelectedPin, bool in_joinExistingGroup,
81 		bool in_persistent, int32_t in_goIntent, std::string* _aidl_return) override;
82 	::ndk::ScopedAStatus cancelConnect() override;
83 	::ndk::ScopedAStatus provisionDiscovery(
84 		const std::vector<uint8_t>& in_peerAddress,
85 		WpsProvisionMethod in_provisionMethod) override;
86 	::ndk::ScopedAStatus addGroup(bool in_persistent, int32_t in_persistentNetworkId) override;
87 	::ndk::ScopedAStatus addGroupWithConfig(
88 		const std::vector<uint8_t>& in_ssid, const std::string& in_pskPassphrase,
89 		bool in_persistent, int32_t in_freq, const std::vector<uint8_t>& in_peerAddress,
90 		bool in_joinExistingGroup) override;
91 	::ndk::ScopedAStatus removeGroup(const std::string& in_groupIfName) override;
92 	::ndk::ScopedAStatus reject(const std::vector<uint8_t>& in_peerAddress) override;
93 	::ndk::ScopedAStatus invite(
94 		const std::string& in_groupIfName,
95 		const std::vector<uint8_t>& in_goDeviceAddress,
96 		const std::vector<uint8_t>& in_peerAddress) override;
97 	::ndk::ScopedAStatus reinvoke(
98 		int32_t in_persistentNetworkId,
99 		const std::vector<uint8_t>& in_peerAddress) override;
100 	::ndk::ScopedAStatus configureExtListen(
101 		int32_t in_periodInMillis, int32_t in_intervalInMillis) override;
102 	::ndk::ScopedAStatus setListenChannel(
103 		int32_t in_channel, int32_t in_operatingClass) override;
104 	::ndk::ScopedAStatus setDisallowedFrequencies(
105 		const std::vector<FreqRange>& in_ranges) override;
106 	::ndk::ScopedAStatus getSsid(
107 		const std::vector<uint8_t>& in_peerAddress,
108 		std::vector<uint8_t>* _aidl_return) override;
109 	::ndk::ScopedAStatus getGroupCapability(
110 		const std::vector<uint8_t>& in_peerAddress,
111 		P2pGroupCapabilityMask* _aidl_return) override;
112 	::ndk::ScopedAStatus addBonjourService(
113 		const std::vector<uint8_t>& in_query,
114 		const std::vector<uint8_t>& in_response) override;
115 	::ndk::ScopedAStatus removeBonjourService(
116 		const std::vector<uint8_t>& in_query) override;
117 	::ndk::ScopedAStatus addUpnpService(
118 		int32_t in_version, const std::string& in_serviceName) override;
119 	::ndk::ScopedAStatus removeUpnpService(
120 		int32_t in_version, const std::string& in_serviceName) override;
121 	::ndk::ScopedAStatus flushServices() override;
122 	::ndk::ScopedAStatus requestServiceDiscovery(
123 		const std::vector<uint8_t>& in_peerAddress,
124 		const std::vector<uint8_t>& in_query, int64_t* _aidl_return) override;
125 	::ndk::ScopedAStatus cancelServiceDiscovery(int64_t in_identifier) override;
126 	::ndk::ScopedAStatus setMiracastMode(MiracastMode in_mode) override;
127 	::ndk::ScopedAStatus startWpsPbc(
128 		const std::string& in_groupIfName,
129 		const std::vector<uint8_t>& in_bssid) override;
130 	::ndk::ScopedAStatus startWpsPinKeypad(
131 		const std::string& in_groupIfName, const std::string& in_pin) override;
132 	::ndk::ScopedAStatus startWpsPinDisplay(
133 		const std::string& in_groupIfName,
134 		const std::vector<uint8_t>& in_bssid,
135 		std::string* _aidl_return) override;
136 	::ndk::ScopedAStatus cancelWps(const std::string& in_groupIfName) override;
137 	::ndk::ScopedAStatus setWpsDeviceName(
138 		const std::string& in_name) override;
139 	::ndk::ScopedAStatus setWpsDeviceType(
140 		const std::vector<uint8_t>& in_type) override;
141 	::ndk::ScopedAStatus setWpsManufacturer(
142 		const std::string& in_manufacturer) override;
143 	::ndk::ScopedAStatus setWpsModelName(
144 		const std::string& in_modelName) override;
145 	::ndk::ScopedAStatus setWpsModelNumber(
146 		const std::string& in_modelNumber) override;
147 	::ndk::ScopedAStatus setWpsSerialNumber(
148 		const std::string& in_serialNumber) override;
149 	::ndk::ScopedAStatus setWpsConfigMethods(
150 		WpsConfigMethods in_configMethods) override;
151 	::ndk::ScopedAStatus enableWfd(bool in_enable) override;
152 	::ndk::ScopedAStatus setWfdDeviceInfo(
153 		const std::vector<uint8_t>& in_info) override;
154 	::ndk::ScopedAStatus createNfcHandoverRequestMessage(
155 		std::vector<uint8_t>* _aidl_return) override;
156 	::ndk::ScopedAStatus createNfcHandoverSelectMessage(
157 		std::vector<uint8_t>* _aidl_return) override;
158 	::ndk::ScopedAStatus reportNfcHandoverInitiation(
159 		const std::vector<uint8_t>& in_select) override;
160 	::ndk::ScopedAStatus reportNfcHandoverResponse(
161 		const std::vector<uint8_t>& in_request) override;
162 	::ndk::ScopedAStatus saveConfig() override;
163 	::ndk::ScopedAStatus setMacRandomization(bool in_enable) override;
164 	::ndk::ScopedAStatus setEdmg(bool in_enable) override;
165 	::ndk::ScopedAStatus getEdmg(bool* _aidl_return) override;
166 	::ndk::ScopedAStatus setWfdR2DeviceInfo(
167 		const std::vector<uint8_t>& in_info) override;
168 	::ndk::ScopedAStatus removeClient(
169 		const std::vector<uint8_t>& peer_address, bool isLegacyClient) override;
170 	::ndk::ScopedAStatus findOnSocialChannels(int32_t in_timeoutInSec) override;
171 	::ndk::ScopedAStatus findOnSpecificFrequency(
172 		int32_t in_freq, int32_t in_timeoutInSec) override;
173 	::ndk::ScopedAStatus setVendorElements(
174 		P2pFrameTypeMask in_frameTypeMask,
175 		const std::vector<uint8_t>& in_vendorElemBytes) override;
176 	::ndk::ScopedAStatus configureEapolIpAddressAllocationParams(
177 		int32_t in_ipAddressGo, int32_t in_ipAddressMask,
178 		int32_t in_ipAddressStart, int32_t in_ipAddressEnd) override;
179 	::ndk::ScopedAStatus connectWithParams(
180 		const P2pConnectInfo& in_connectInfo, std::string* _aidl_return) override;
181 	::ndk::ScopedAStatus findWithParams(const P2pDiscoveryInfo& in_discoveryInfo) override;
182 	::ndk::ScopedAStatus configureExtListenWithParams(
183 		const P2pExtListenInfo& in_extListenInfo) override;
184 	::ndk::ScopedAStatus addGroupWithConfigurationParams(
185 		const P2pAddGroupConfigurationParams& in_groupConfigurationParams) override;
186 	::ndk::ScopedAStatus createGroupOwner(
187 		const P2pCreateGroupOwnerInfo& in_groupOwnerInfo) override;
188 	::ndk::ScopedAStatus getFeatureSet(int64_t* _aidl_return) override;
189 	::ndk::ScopedAStatus startUsdBasedServiceDiscovery(
190 		const P2pUsdBasedServiceDiscoveryConfig& in_serviceDiscoveryConfig,
191 		int32_t* _aidl_return) override;
192 	::ndk::ScopedAStatus stopUsdBasedServiceDiscovery(int32_t in_sessionId) override;
193 	::ndk::ScopedAStatus startUsdBasedServiceAdvertisement(
194 		const P2pUsdBasedServiceAdvertisementConfig& in_serviceAdvertisementConfig,
195 		int32_t* _aidl_return) override;
196 	::ndk::ScopedAStatus stopUsdBasedServiceAdvertisement(int32_t in_sessionId) override;
197 	::ndk::ScopedAStatus provisionDiscoveryWithParams(
198 		const P2pProvisionDiscoveryParams& in_params) override;
199 	::ndk::ScopedAStatus getDirInfo(P2pDirInfo* _aidl_return) override;
200 	::ndk::ScopedAStatus validateDirInfo(const P2pDirInfo &in_dirInfo,
201 		int32_t* _aidl_return) override;
202 	::ndk::ScopedAStatus reinvokePersistentGroup(
203 		const P2pReinvokePersistentGroupParams& in_reinvokeGroupParams) override;
204 
205 
206 private:
207 	// Corresponding worker functions for the AIDL methods.
208 	std::pair<std::string, ndk::ScopedAStatus> getNameInternal();
209 	std::pair<IfaceType, ndk::ScopedAStatus> getTypeInternal();
210 	std::pair<std::shared_ptr<ISupplicantP2pNetwork>, ndk::ScopedAStatus>
211 		addNetworkInternal();
212 	ndk::ScopedAStatus removeNetworkInternal(int32_t id);
213 	std::pair<std::shared_ptr<ISupplicantP2pNetwork>, ndk::ScopedAStatus>
214 		getNetworkInternal(int32_t id);
215 	std::pair<std::vector<int32_t>, ndk::ScopedAStatus>
216 		listNetworksInternal();
217 	ndk::ScopedAStatus registerCallbackInternal(
218 		const std::shared_ptr<ISupplicantP2pIfaceCallback>& callback);
219 	std::pair<std::vector<uint8_t>, ndk::ScopedAStatus>
220 		getDeviceAddressInternal();
221 	ndk::ScopedAStatus setSsidPostfixInternal(
222 		const std::vector<uint8_t>& postfix);
223 	ndk::ScopedAStatus setGroupIdleInternal(
224 		const std::string& group_ifname, uint32_t timeout_in_sec);
225 	ndk::ScopedAStatus setPowerSaveInternal(
226 		const std::string& group_ifname, bool enable);
227 	ndk::ScopedAStatus findInternal(uint32_t timeout_in_sec);
228 	ndk::ScopedAStatus stopFindInternal();
229 	ndk::ScopedAStatus flushInternal();
230 	std::pair<std::string, ndk::ScopedAStatus> connectInternal(
231 		const std::vector<uint8_t>& peer_address,
232 		WpsProvisionMethod provision_method,
233 		const std::string& pre_selected_pin, bool join_existing_group,
234 		bool persistent, uint32_t go_intent,
235 		uint32_t pairing_bootstrapping_method, const std::string& password,
236 		uint32_t frequency, bool authorize, const std::string& group_ifname);
237 	ndk::ScopedAStatus cancelConnectInternal();
238 	ndk::ScopedAStatus provisionDiscoveryInternal(
239 		const std::vector<uint8_t>& peer_address,
240 		WpsProvisionMethod provision_method,
241 		uint32_t pairingBootstrappingMethod);
242 	ndk::ScopedAStatus addGroupInternal(bool in_persistent, int32_t in_persistentNetworkId,
243 		bool isP2pV2);
244 	ndk::ScopedAStatus addGroupWithConfigInternal(
245 		const std::vector<uint8_t>& ssid, const std::string& passphrase,
246 		bool persistent, uint32_t freq, const std::vector<uint8_t>& peer_address,
247 		bool joinExistingGroup, uint32_t key_mgmt_mask);
248 	ndk::ScopedAStatus removeGroupInternal(const std::string& group_ifname);
249 	ndk::ScopedAStatus rejectInternal(
250 		const std::vector<uint8_t>& peer_address);
251 	ndk::ScopedAStatus inviteInternal(
252 		const std::string& group_ifname,
253 		const std::vector<uint8_t>& go_device_address,
254 		const std::vector<uint8_t>& peer_address);
255 	ndk::ScopedAStatus reinvokeInternal(
256 		const std::vector<uint8_t>& peer_address,
257 		int32_t persistent_network_id,
258 		int32_t device_identity_entry_id);
259 	ndk::ScopedAStatus configureExtListenInternal(
260 		uint32_t period_in_millis, uint32_t interval_in_millis);
261 	ndk::ScopedAStatus setListenChannelInternal(
262 		uint32_t channel, uint32_t operating_class);
263 	ndk::ScopedAStatus setDisallowedFrequenciesInternal(
264 		const std::vector<FreqRange>& ranges);
265 	std::pair<std::vector<uint8_t>, ndk::ScopedAStatus> getSsidInternal(
266 		const std::vector<uint8_t>& peer_address);
267 	std::pair<P2pGroupCapabilityMask, ndk::ScopedAStatus> getGroupCapabilityInternal(
268 		const std::vector<uint8_t>& peer_address);
269 	ndk::ScopedAStatus addBonjourServiceInternal(
270 		const std::vector<uint8_t>& query,
271 		const std::vector<uint8_t>& response);
272 	ndk::ScopedAStatus removeBonjourServiceInternal(
273 		const std::vector<uint8_t>& query);
274 	ndk::ScopedAStatus addUpnpServiceInternal(
275 		uint32_t version, const std::string& service_name);
276 	ndk::ScopedAStatus removeUpnpServiceInternal(
277 		uint32_t version, const std::string& service_name);
278 	ndk::ScopedAStatus flushServicesInternal();
279 	std::pair<uint64_t, ndk::ScopedAStatus> requestServiceDiscoveryInternal(
280 		const std::vector<uint8_t>& peer_address,
281 		const std::vector<uint8_t>& query);
282 	ndk::ScopedAStatus cancelServiceDiscoveryInternal(uint64_t identifier);
283 	ndk::ScopedAStatus setMiracastModeInternal(
284 		MiracastMode mode);
285 	ndk::ScopedAStatus startWpsPbcInternal(
286 		const std::string& group_ifname,
287 		const std::vector<uint8_t>& bssid);
288 	ndk::ScopedAStatus startWpsPinKeypadInternal(
289 		const std::string& group_ifname, const std::string& pin);
290 	std::pair<std::string, ndk::ScopedAStatus> startWpsPinDisplayInternal(
291 		const std::string& group_ifname,
292 		const std::vector<uint8_t>& bssid);
293 	ndk::ScopedAStatus cancelWpsInternal(const std::string& group_ifname);
294 	ndk::ScopedAStatus setWpsDeviceNameInternal(const std::string& name);
295 	ndk::ScopedAStatus setWpsDeviceTypeInternal(
296 		const std::vector<uint8_t>& type);
297 	ndk::ScopedAStatus setWpsManufacturerInternal(
298 		const std::string& manufacturer);
299 	ndk::ScopedAStatus setWpsModelNameInternal(const std::string& model_name);
300 	ndk::ScopedAStatus setWpsModelNumberInternal(
301 		const std::string& model_number);
302 	ndk::ScopedAStatus setWpsSerialNumberInternal(
303 		const std::string& serial_number);
304 	ndk::ScopedAStatus setWpsConfigMethodsInternal(WpsConfigMethods config_methods);
305 	ndk::ScopedAStatus enableWfdInternal(bool enable);
306 	ndk::ScopedAStatus setWfdDeviceInfoInternal(
307 		const std::vector<uint8_t>& info);
308 	std::pair<std::vector<uint8_t>, ndk::ScopedAStatus>
309 		createNfcHandoverRequestMessageInternal();
310 	std::pair<std::vector<uint8_t>, ndk::ScopedAStatus>
311 		createNfcHandoverSelectMessageInternal();
312 	ndk::ScopedAStatus reportNfcHandoverResponseInternal(
313 		const std::vector<uint8_t>& request);
314 	ndk::ScopedAStatus reportNfcHandoverInitiationInternal(
315 		const std::vector<uint8_t>& select);
316 	ndk::ScopedAStatus saveConfigInternal();
317 	ndk::ScopedAStatus setMacRandomizationInternal(bool enable);
318 	ndk::ScopedAStatus setEdmgInternal(bool enable);
319 	std::pair<bool, ndk::ScopedAStatus> getEdmgInternal();
320 	ndk::ScopedAStatus setWfdR2DeviceInfoInternal(
321 		const std::vector<uint8_t>& info);
322 	ndk::ScopedAStatus removeClientInternal(
323 		const std::vector<uint8_t>& peer_address, bool isLegacyClient);
324 	ndk::ScopedAStatus findOnSocialChannelsInternal(uint32_t timeout_in_sec);
325 	ndk::ScopedAStatus findOnSpecificFrequencyInternal(
326 		uint32_t freq, uint32_t timeout_in_sec);
327 	ndk::ScopedAStatus setVendorElementsInternal(
328 		P2pFrameTypeMask frameTypeMask,
329 		const std::vector<uint8_t>& vendorElemBytes);
330 	::ndk::ScopedAStatus configureEapolIpAddressAllocationParamsInternal(
331 		uint32_t ipAddressGo, uint32_t ipAddressMask,
332 		uint32_t ipAddressStart, uint32_t ipAddressEnd);
333 	std::pair<std::string, ndk::ScopedAStatus> connectWithParamsInternal(
334 		const P2pConnectInfo& connectInfo);
335 	ndk::ScopedAStatus findWithParamsInternal(const P2pDiscoveryInfo& discoveryInfo);
336 	ndk::ScopedAStatus configureExtListenWithParamsInternal(const P2pExtListenInfo& extListenInfo);
337 	ndk::ScopedAStatus addGroupWithConfigurationParamsInternal(
338 		const P2pAddGroupConfigurationParams& groupConfigurationParams);
339 	ndk::ScopedAStatus createGroupOwnerInternal(
340 		const P2pCreateGroupOwnerInfo& groupOwnerInfo);
341 	std::pair<int64_t, ndk::ScopedAStatus> getFeatureSetInternal();
342 	std::pair<uint32_t, ndk::ScopedAStatus> startUsdBasedServiceDiscoveryInternal(
343 		const P2pUsdBasedServiceDiscoveryConfig& serviceDiscoveryConfig);
344 	::ndk::ScopedAStatus stopUsdBasedServiceDiscoveryInternal(uint32_t sessionId);
345 	std::pair<uint32_t, ndk::ScopedAStatus> startUsdBasedServiceAdvertisementInternal(
346 		const P2pUsdBasedServiceAdvertisementConfig& serviceAdvertisementConfig);
347 	::ndk::ScopedAStatus stopUsdBasedServiceAdvertisementInternal(uint32_t sessionId);
348 	::ndk::ScopedAStatus provisionDiscoveryWithParamsInternal(
349 		const P2pProvisionDiscoveryParams& params);
350 	std::pair<P2pDirInfo, ndk::ScopedAStatus> getDirInfoInternal();
351 	std::pair<int32_t, ndk::ScopedAStatus> validateDirInfoInternal(
352 		const P2pDirInfo& dirInfo);
353 	::ndk::ScopedAStatus reinvokePersistentGroupInternal(
354 		const P2pReinvokePersistentGroupParams& reinvokeGroupParams);
355 
356 	struct wpa_supplicant* retrieveIfacePtr();
357 	struct wpa_supplicant* retrieveGroupIfacePtr(
358 		const std::string& group_ifname);
359 
360 	// Reference to the global wpa_struct. This is assumed to be valid for
361 	// the lifetime of the process.
362 	struct wpa_global* wpa_global_;
363 	// Name of the iface this aidl object controls
364 	const std::string ifname_;
365 	bool is_valid_;
366 
367 	DISALLOW_COPY_AND_ASSIGN(P2pIface);
368 };
369 
370 }  // namespace supplicant
371 }  // namespace wifi
372 }  // namespace hardware
373 }  // namespace android
374 }  // namespace aidl
375 
376 #endif  // WPA_SUPPLICANT_AIDL_P2P_IFACE_H
377