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