hidl_manager.cpp revision 235f7da827f7236c90f837b5604a026d3f61b8a1
1e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt/* 257ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * hidl interface for wpa_supplicant daemon 3e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt * Copyright (c) 2004-2016, Jouni Malinen <j@w1.fi> 4e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt * Copyright (c) 2004-2016, Roshan Pius <rpius@google.com> 5e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt * 6e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt * This software may be distributed under the terms of the BSD license. 7e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt * See README for more details. 8e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt */ 9e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 108e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius#include <algorithm> 118366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius#include <regex> 128e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius 1357ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius#include "hidl_manager.h" 148894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius#include "misc_utils.h" 15e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 168366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piusextern "C" { 178366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius#include "src/eap_common/eap_sim_common.h" 188366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius} 198366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius 20ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusnamespace { 218366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piususing android::hardware::hidl_array; 228366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius 23fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusconstexpr uint8_t kWfdDeviceInfoLen = 8; 248366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius// GSM-AUTH:<RAND1>:<RAND2>[:<RAND3>] 258366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piusconstexpr char kGsmAuthRegex2[] = "GSM-AUTH:([0-9a-f]+):([0-9a-f]+)"; 268366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piusconstexpr char kGsmAuthRegex3[] = 278366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius "GSM-AUTH:([0-9a-f]+):([0-9a-f]+):([0-9a-f]+)"; 288366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius// UMTS-AUTH:<RAND>:<AUTN> 298366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piusconstexpr char kUmtsAuthRegex[] = "UMTS-AUTH:([0-9a-f]+):([0-9a-f]+)"; 308366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piusconstexpr size_t kGsmRandLenBytes = GSM_RAND_LEN; 318366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piusconstexpr size_t kUmtsRandLenBytes = EAP_AKA_RAND_LEN; 328366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piusconstexpr size_t kUmtsAutnLenBytes = EAP_AKA_AUTN_LEN; 33fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 34ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius/** 35ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Check if the provided |wpa_supplicant| structure represents a P2P iface or 36ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * not. 37ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius */ 38ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusconstexpr bool isP2pIface(const struct wpa_supplicant *wpa_s) 39ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 40ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return (wpa_s->global->p2p_init_wpa_s == wpa_s); 41ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 42ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 43ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius/** 44ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Creates a unique key for the network using the provided |ifname| and 45ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * |network_id| to be used in the internal map of |ISupplicantNetwork| objects. 46ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * This is of the form |ifname|_|network_id|. For ex: "wlan0_1". 47ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 48ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param ifname Name of the corresponding interface. 49ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param network_id ID of the corresponding network. 50ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius */ 51ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusconst std::string getNetworkObjectMapKey( 52ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, int network_id) 53ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 54ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return ifname + "_" + std::to_string(network_id); 55ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 56ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 57ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius/** 58ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Add callback to the corresponding list after linking to death on the 59ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * corresponding hidl object reference. 60ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius */ 61ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class CallbackType> 62ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint registerForDeathAndAddCallbackHidlObjectToList( 63ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<CallbackType> &callback, 64ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function<void(const android::sp<CallbackType> &)> 65ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &on_hidl_died_fctor, 66ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::vector<android::sp<CallbackType>> &callback_list) 67ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 68ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius#if 0 // TODO(b/31632518): HIDL object death notifications. 69ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto death_notifier = new CallbackObjectDeathNotifier<CallbackType>( 70ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callback, on_hidl_died_fctor); 71ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Use the |callback.get()| as cookie so that we don't need to 72ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // store a reference to this |CallbackObjectDeathNotifier| instance 73ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // to use in |unlinkToDeath| later. 74ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // NOTE: This may cause an immediate callback if the object is already 75ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // dead, so add it to the list before we register for callback! 76ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (android::hardware::IInterface::asBinder(callback)->linkToDeath( 77ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius death_notifier, callback.get()) != android::OK) { 78ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius wpa_printf( 79ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius MSG_ERROR, 80ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius "Error registering for death notification for " 81ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius "supplicant callback object"); 82ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callback_list.erase( 83ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::remove( 84ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callback_list.begin(), callback_list.end(), callback), 85ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callback_list.end()); 86ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 87ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 88ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius#endif // TODO(b/31632518): HIDL object death notifications. 89ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callback_list.push_back(callback); 90ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 0; 91e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt} 92e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 93ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class ObjectType> 94ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint addHidlObjectToMap( 95ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &key, const android::sp<ObjectType> object, 96ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::map<const std::string, android::sp<ObjectType>> &object_map) 97ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 98ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Return failure if we already have an object for that |key|. 99ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (object_map.find(key) != object_map.end()) 100ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 101ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius object_map[key] = object; 102ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (!object_map[key].get()) 103ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 104ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 0; 105ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 106ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 107ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class ObjectType> 108ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint removeHidlObjectFromMap( 109ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &key, 110ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::map<const std::string, android::sp<ObjectType>> &object_map) 111ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 112ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Return failure if we dont have an object for that |key|. 11319f21dcdb1ecf8504efef43a384b1b81b9dee905Roshan Pius const auto &object_iter = object_map.find(key); 11419f21dcdb1ecf8504efef43a384b1b81b9dee905Roshan Pius if (object_iter == object_map.end()) 115ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 11619f21dcdb1ecf8504efef43a384b1b81b9dee905Roshan Pius object_iter->second->invalidate(); 11719f21dcdb1ecf8504efef43a384b1b81b9dee905Roshan Pius object_map.erase(object_iter); 118ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 0; 119ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 120ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 121ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class CallbackType> 122ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint addIfaceCallbackHidlObjectToMap( 123ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, const android::sp<CallbackType> &callback, 124ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function<void(const android::sp<CallbackType> &)> 125ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &on_hidl_died_fctor, 126ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::map<const std::string, std::vector<android::sp<CallbackType>>> 127ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &callbacks_map) 128ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 129ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (ifname.empty()) 130ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 131ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 132ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto iface_callback_map_iter = callbacks_map.find(ifname); 133ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (iface_callback_map_iter == callbacks_map.end()) 134ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 135ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto &iface_callback_list = iface_callback_map_iter->second; 136ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 137ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Register for death notification before we add it to our list. 138ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return registerForDeathAndAddCallbackHidlObjectToList<CallbackType>( 139ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callback, on_hidl_died_fctor, iface_callback_list); 140ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 141ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 142ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class CallbackType> 143ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint addNetworkCallbackHidlObjectToMap( 144ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, int network_id, 145ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<CallbackType> &callback, 146ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function<void(const android::sp<CallbackType> &)> 147ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &on_hidl_died_fctor, 148ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::map<const std::string, std::vector<android::sp<CallbackType>>> 149ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &callbacks_map) 150ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 151ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (ifname.empty() || network_id < 0) 152ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 153ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 154ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Generate the key to be used to lookup the network. 155ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string network_key = 156ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius getNetworkObjectMapKey(ifname, network_id); 157ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto network_callback_map_iter = callbacks_map.find(network_key); 158ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (network_callback_map_iter == callbacks_map.end()) 159ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 160ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto &network_callback_list = network_callback_map_iter->second; 161ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 162ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Register for death notification before we add it to our list. 163ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return registerForDeathAndAddCallbackHidlObjectToList<CallbackType>( 164ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callback, on_hidl_died_fctor, network_callback_list); 165ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 166ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 167ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class CallbackType> 168ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint removeAllIfaceCallbackHidlObjectsFromMap( 169ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, 170ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::map<const std::string, std::vector<android::sp<CallbackType>>> 171ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &callbacks_map) 172ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 173ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto iface_callback_map_iter = callbacks_map.find(ifname); 174ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (iface_callback_map_iter == callbacks_map.end()) 175ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 176ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius#if 0 // TODO(b/31632518): HIDL object death notifications. 177ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const auto &iface_callback_list = iface_callback_map_iter->second; 178ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius for (const auto &callback : iface_callback_list) { 179ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (android::hardware::IInterface::asBinder(callback) 180ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ->unlinkToDeath(nullptr, callback.get()) != 181ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius android::OK) { 182ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius wpa_printf( 183ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius MSG_ERROR, 184ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius "Error deregistering for death notification for " 185ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius "iface callback object"); 186ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 187ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 188ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius#endif // TODO(b/31632518): HIDL object death notifications. 189ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callbacks_map.erase(iface_callback_map_iter); 190ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 0; 191ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 192ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 193ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class CallbackType> 194ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint removeAllNetworkCallbackHidlObjectsFromMap( 195ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &network_key, 196ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::map<const std::string, std::vector<android::sp<CallbackType>>> 197ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &callbacks_map) 198ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 199ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto network_callback_map_iter = callbacks_map.find(network_key); 200ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (network_callback_map_iter == callbacks_map.end()) 201ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 202ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius#if 0 // TODO(b/31632518): HIDL object death notifications. 203ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const auto &network_callback_list = network_callback_map_iter->second; 204ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius for (const auto &callback : network_callback_list) { 205ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (android::hardware::IInterface::asBinder(callback) 206ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ->unlinkToDeath(nullptr, callback.get()) != 207ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius android::OK) { 208ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius wpa_printf( 209ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius MSG_ERROR, 210ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius "Error deregistering for death " 211ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius "notification for " 212ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius "network callback object"); 213ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 214ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 215ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius#endif // TODO(b/31632518): HIDL object death notifications. 216ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callbacks_map.erase(network_callback_map_iter); 217ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 0; 218ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 219ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 220ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class CallbackType> 221ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid removeIfaceCallbackHidlObjectFromMap( 222ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, const android::sp<CallbackType> &callback, 223ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::map<const std::string, std::vector<android::sp<CallbackType>>> 224ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &callbacks_map) 225ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 226ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (ifname.empty()) 227ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return; 228ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 229ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto iface_callback_map_iter = callbacks_map.find(ifname); 230ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (iface_callback_map_iter == callbacks_map.end()) 231ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return; 232ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 233ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto &iface_callback_list = iface_callback_map_iter->second; 234ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius iface_callback_list.erase( 235ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::remove( 236ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius iface_callback_list.begin(), iface_callback_list.end(), 237ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callback), 238ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius iface_callback_list.end()); 239ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 240ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 241ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class CallbackType> 242ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid removeNetworkCallbackHidlObjectFromMap( 243ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, int network_id, 244ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<CallbackType> &callback, 245ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::map<const std::string, std::vector<android::sp<CallbackType>>> 246ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &callbacks_map) 247ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 248ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (ifname.empty() || network_id < 0) 249ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return; 250ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 251ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Generate the key to be used to lookup the network. 252ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string network_key = 253ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius getNetworkObjectMapKey(ifname, network_id); 254ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 255ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto network_callback_map_iter = callbacks_map.find(network_key); 256ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (network_callback_map_iter == callbacks_map.end()) 257ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return; 258ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 259ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto &network_callback_list = network_callback_map_iter->second; 260ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius network_callback_list.erase( 261ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::remove( 262ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius network_callback_list.begin(), network_callback_list.end(), 263ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callback), 264ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius network_callback_list.end()); 265ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 266ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 267ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class CallbackType> 268ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid callWithEachIfaceCallback( 269ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, 270ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function< 271ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius android::hardware::Return<void>(android::sp<CallbackType>)> &method, 272ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::map<const std::string, std::vector<android::sp<CallbackType>>> 273ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &callbacks_map) 274ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 275ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (ifname.empty()) 276ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return; 277ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 278ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto iface_callback_map_iter = callbacks_map.find(ifname); 279ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (iface_callback_map_iter == callbacks_map.end()) 280ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return; 281ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const auto &iface_callback_list = iface_callback_map_iter->second; 282ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius for (const auto &callback : iface_callback_list) { 283cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius if (!method(callback).isOk()) { 284cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius wpa_printf( 285cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius MSG_ERROR, "Failed to invoke HIDL iface callback"); 286cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius } 287ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 288ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 289ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 290ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class CallbackType> 291ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid callWithEachNetworkCallback( 292ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, int network_id, 293ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function< 294ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius android::hardware::Return<void>(android::sp<CallbackType>)> &method, 295ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::map<const std::string, std::vector<android::sp<CallbackType>>> 296ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &callbacks_map) 297ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 298ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (ifname.empty() || network_id < 0) 299ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return; 300ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 301ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Generate the key to be used to lookup the network. 302ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string network_key = 303ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius getNetworkObjectMapKey(ifname, network_id); 304ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto network_callback_map_iter = callbacks_map.find(network_key); 305ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (network_callback_map_iter == callbacks_map.end()) 306ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return; 307ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const auto &network_callback_list = network_callback_map_iter->second; 308ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius for (const auto &callback : network_callback_list) { 309cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius if (!method(callback).isOk()) { 310cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius wpa_printf( 311cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius MSG_ERROR, 312cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius "Failed to invoke HIDL network callback"); 313cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius } 314ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 315ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 3169322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 3178366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piusint parseGsmAuthNetworkRequest( 3188366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius const std::string ¶ms_str, 3198366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::vector<hidl_array<uint8_t, kGsmRandLenBytes>> *out_rands) 3208366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius{ 3218366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::smatch matches; 3228366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::regex params_gsm_regex2(kGsmAuthRegex2); 3238366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::regex params_gsm_regex3(kGsmAuthRegex3); 3248366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius if (!std::regex_match(params_str, matches, params_gsm_regex3) && 3258366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius !std::regex_match(params_str, matches, params_gsm_regex2)) { 3268366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 1; 3278366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 3288366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius for (uint32_t i = 1; i < matches.size(); i++) { 3298366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius hidl_array<uint8_t, kGsmRandLenBytes> rand; 3308366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius const auto &match = matches[i]; 3318366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius WPA_ASSERT(match.size() >= 2 * rand.size()); 3328366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius if (hexstr2bin(match.str().c_str(), rand.data(), rand.size())) { 3338366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius wpa_printf( 3348366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius MSG_ERROR, "Failed to parse GSM auth params"); 3358366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 1; 3368366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 3378366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius out_rands->push_back(rand); 3388366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 3398366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 0; 3408366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius} 3418366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius 3428366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piusint parseUmtsAuthNetworkRequest( 3438366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius const std::string ¶ms_str, 3448366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius hidl_array<uint8_t, kUmtsRandLenBytes> *out_rand, 3458366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius hidl_array<uint8_t, kUmtsAutnLenBytes> *out_autn) 3468366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius{ 3478366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::smatch matches; 3488366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::regex params_umts_regex(kUmtsAuthRegex); 3498366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius if (!std::regex_match(params_str, matches, params_umts_regex)) { 3508366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 1; 3518366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 3528366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius WPA_ASSERT(matches[1].size() >= 2 * out_rand->size()); 3538366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius if (hexstr2bin( 3548366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius matches[1].str().c_str(), out_rand->data(), out_rand->size())) { 3558366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius wpa_printf(MSG_ERROR, "Failed to parse UMTS auth params"); 3568366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 1; 3578366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 3588366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius WPA_ASSERT(matches[2].size() >= 2 * out_autn->size()); 3598366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius if (hexstr2bin( 3608366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius matches[2].str().c_str(), out_autn->data(), out_autn->size())) { 3618366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius wpa_printf(MSG_ERROR, "Failed to parse UMTS auth params"); 3628366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 1; 3638366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 3648366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 0; 3658366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius} 366ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} // namespace 367ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 3687c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace android { 3697c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace hardware { 3707c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace wifi { 3717c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace supplicant { 3727c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace V1_0 { 3737c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace implementation { 374e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 37557ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan PiusHidlManager *HidlManager::instance_ = NULL; 376e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 37757ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan PiusHidlManager *HidlManager::getInstance() 378e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt{ 379e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt if (!instance_) 38057ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius instance_ = new HidlManager(); 381e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return instance_; 382e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt} 383e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 38457ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusvoid HidlManager::destroyInstance() 385e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt{ 386e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt if (instance_) 387e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt delete instance_; 388e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt instance_ = NULL; 389e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt} 390e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 39157ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusint HidlManager::registerHidlService(struct wpa_global *global) 392e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt{ 3937c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius // Create the main hidl service object and register it. 394e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt supplicant_object_ = new Supplicant(global); 39594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius if (supplicant_object_->registerAsService() != android::NO_ERROR) { 3967c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius return 1; 3977c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius } 398e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return 0; 399e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt} 400e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 40132c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius/** 40257ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * Register an interface to hidl manager. 40332c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * 40432c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface. 40532c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * 40632c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * @return 0 on success, 1 on failure. 40732c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius */ 40857ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusint HidlManager::registerInterface(struct wpa_supplicant *wpa_s) 409e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt{ 410e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt if (!wpa_s) 411e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return 1; 412e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 413ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (isP2pIface(wpa_s)) { 414ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (addHidlObjectToMap<P2pIface>( 415fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 416fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius new P2pIface(wpa_s->global, wpa_s->ifname), 4177ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius p2p_iface_object_map_)) { 4187ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius wpa_printf( 4197ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius MSG_ERROR, 4207ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "Failed to register P2P interface with HIDL " 4217ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "control: %s", 4227ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius wpa_s->ifname); 423ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 4247ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius } 425fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_callbacks_map_[wpa_s->ifname] = 426ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::vector<android::sp<ISupplicantP2pIfaceCallback>>(); 427ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } else { 428ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (addHidlObjectToMap<StaIface>( 429fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 430fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius new StaIface(wpa_s->global, wpa_s->ifname), 4317ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius sta_iface_object_map_)) { 4327ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius wpa_printf( 4337ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius MSG_ERROR, 4347ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "Failed to register STA interface with HIDL " 4357ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "control: %s", 4367ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius wpa_s->ifname); 437ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 4387ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius } 439fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_callbacks_map_[wpa_s->ifname] = 440ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::vector<android::sp<ISupplicantStaIfaceCallback>>(); 441ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 4422d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius 4437c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius // Invoke the |onInterfaceCreated| method on all registered callbacks. 4442d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius callWithEachSupplicantCallback(std::bind( 4457c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius &ISupplicantCallback::onInterfaceCreated, std::placeholders::_1, 446fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname)); 447e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return 0; 448e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt} 449e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 45032c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius/** 45157ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * Unregister an interface from hidl manager. 45232c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * 45332c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface. 45432c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * 45532c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * @return 0 on success, 1 on failure. 45632c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius */ 45757ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusint HidlManager::unregisterInterface(struct wpa_supplicant *wpa_s) 458e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt{ 45932c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius if (!wpa_s) 460e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return 1; 461e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 462ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (isP2pIface(wpa_s)) { 463fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (removeHidlObjectFromMap( 4647ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius wpa_s->ifname, p2p_iface_object_map_)) { 4657ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius wpa_printf( 4667ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius MSG_ERROR, 4677ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "Failed to unregister P2P interface with HIDL " 4687ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "control: %s", 4697ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius wpa_s->ifname); 470ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 4717ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius } 472ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (removeAllIfaceCallbackHidlObjectsFromMap( 473fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, p2p_iface_callbacks_map_)) { 474ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 475ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 476ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } else { 477fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (removeHidlObjectFromMap( 4787ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius wpa_s->ifname, sta_iface_object_map_)) { 4797ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius wpa_printf( 4807ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius MSG_ERROR, 4817ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "Failed to unregister STA interface with HIDL " 4827ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "control: %s", 4837ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius wpa_s->ifname); 484ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 4857ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius } 486ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (removeAllIfaceCallbackHidlObjectsFromMap( 487fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, sta_iface_callbacks_map_)) { 488ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 4898e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius } 4908e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius } 4912d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius 4927c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius // Invoke the |onInterfaceRemoved| method on all registered callbacks. 4932d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius callWithEachSupplicantCallback(std::bind( 4947c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius &ISupplicantCallback::onInterfaceRemoved, std::placeholders::_1, 495fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname)); 496e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return 0; 497e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt} 498e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 49932c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius/** 50057ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * Register a network to hidl manager. 501d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * 502d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface on which 503d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * the network is added. 504d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @param ssid |wpa_ssid| struct corresponding to the network being added. 505d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * 506d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @return 0 on success, 1 on failure. 507d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius */ 50857ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusint HidlManager::registerNetwork( 509d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid) 510d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius{ 511d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius if (!wpa_s || !ssid) 512d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius return 1; 513d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 514d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius // Generate the key to be used to lookup the network. 515d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius const std::string network_key = 516d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius getNetworkObjectMapKey(wpa_s->ifname, ssid->id); 517d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 518ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (isP2pIface(wpa_s)) { 519ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (addHidlObjectToMap<P2pNetwork>( 520ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius network_key, 521ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius new P2pNetwork(wpa_s->global, wpa_s->ifname, ssid->id), 5227ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius p2p_network_object_map_)) { 5237ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius wpa_printf( 5247ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius MSG_ERROR, 5257ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "Failed to register P2P network with HIDL " 5267ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "control: %d", 5277ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius ssid->id); 528ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 5297ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius } 530ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius p2p_network_callbacks_map_[network_key] = 531ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::vector<android::sp<ISupplicantP2pNetworkCallback>>(); 532ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Invoke the |onNetworkAdded| method on all registered 533ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // callbacks. 534ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callWithEachP2pIfaceCallback( 535ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius wpa_s->ifname, 536ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::bind( 537ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &ISupplicantP2pIfaceCallback::onNetworkAdded, 538ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::placeholders::_1, ssid->id)); 539ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } else { 540ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (addHidlObjectToMap<StaNetwork>( 541ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius network_key, 542ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius new StaNetwork(wpa_s->global, wpa_s->ifname, ssid->id), 5437ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius sta_network_object_map_)) { 5447ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius wpa_printf( 5457ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius MSG_ERROR, 5467ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "Failed to register STA network with HIDL " 5477ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "control: %d", 5487ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius ssid->id); 549ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 5507ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius } 551ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius sta_network_callbacks_map_[network_key] = 552ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::vector<android::sp<ISupplicantStaNetworkCallback>>(); 553ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Invoke the |onNetworkAdded| method on all registered 554ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // callbacks. 555ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callWithEachStaIfaceCallback( 556ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius wpa_s->ifname, 557ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::bind( 558ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &ISupplicantStaIfaceCallback::onNetworkAdded, 559ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::placeholders::_1, ssid->id)); 560ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 561d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius return 0; 562d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius} 563d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 564d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius/** 56557ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * Unregister a network from hidl manager. 566d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * 567d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface on which 568d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * the network is added. 569d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @param ssid |wpa_ssid| struct corresponding to the network being added. 570d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * 571d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @return 0 on success, 1 on failure. 572d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius */ 57357ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusint HidlManager::unregisterNetwork( 574d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid) 575d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius{ 576d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius if (!wpa_s || !ssid) 577d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius return 1; 578d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 579d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius // Generate the key to be used to lookup the network. 580d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius const std::string network_key = 581d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius getNetworkObjectMapKey(wpa_s->ifname, ssid->id); 582d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 583ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (isP2pIface(wpa_s)) { 5847ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius if (removeHidlObjectFromMap( 5857ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius network_key, p2p_network_object_map_)) { 5867ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius wpa_printf( 5877ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius MSG_ERROR, 5887ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "Failed to unregister P2P network with HIDL " 5897ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "control: %d", 5907ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius ssid->id); 591ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 5927ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius } 593ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (removeAllNetworkCallbackHidlObjectsFromMap( 594ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius network_key, p2p_network_callbacks_map_)) 595ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 596ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 597ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Invoke the |onNetworkRemoved| method on all registered 598ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // callbacks. 599ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callWithEachP2pIfaceCallback( 600ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius wpa_s->ifname, 601ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::bind( 602ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &ISupplicantP2pIfaceCallback::onNetworkRemoved, 603ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::placeholders::_1, ssid->id)); 604ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } else { 6057ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius if (removeHidlObjectFromMap( 6067ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius network_key, sta_network_object_map_)) { 6077ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius wpa_printf( 6087ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius MSG_ERROR, 6097ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "Failed to unregister STA network with HIDL " 6107ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "control: %d", 6117ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius ssid->id); 612ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 6137ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius } 614ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (removeAllNetworkCallbackHidlObjectsFromMap( 615ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius network_key, sta_network_callbacks_map_)) 616ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 617ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 618ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Invoke the |onNetworkRemoved| method on all registered 619ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // callbacks. 620ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callWithEachStaIfaceCallback( 621ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius wpa_s->ifname, 622ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::bind( 623ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &ISupplicantStaIfaceCallback::onNetworkRemoved, 624ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::placeholders::_1, ssid->id)); 6258e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius } 626e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius return 0; 627e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius} 628e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius 629e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius/** 630e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius * Notify all listeners about any state changes on a particular interface. 631e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius * 632e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface on which 633e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius * the state change event occured. 634e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius */ 63557ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusint HidlManager::notifyStateChange(struct wpa_supplicant *wpa_s) 636e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius{ 637e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius if (!wpa_s) 638e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius return 1; 639e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius 640fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 641fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 642e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius return 1; 643e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius 6447c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius // Invoke the |onStateChanged| method on all registered callbacks. 6457c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius uint32_t hidl_network_id = UINT32_MAX; 6467c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius std::vector<uint8_t> hidl_ssid; 647e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius if (wpa_s->current_ssid) { 6487c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius hidl_network_id = wpa_s->current_ssid->id; 6497c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius hidl_ssid.assign( 650e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius wpa_s->current_ssid->ssid, 651e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius wpa_s->current_ssid->ssid + wpa_s->current_ssid->ssid_len); 652e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius } 653ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callWithEachStaIfaceCallback( 6547c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius wpa_s->ifname, std::bind( 655ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &ISupplicantStaIfaceCallback::onStateChanged, 656fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, 657fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius static_cast<ISupplicantStaIfaceCallback::State>( 658fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->wpa_state), 659fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->bssid, hidl_network_id, hidl_ssid)); 660d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius return 0; 661d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius} 662d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 663d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius/** 66465628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius * Notify all listeners about a request on a particular network. 66565628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius * 66665628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface on which 66765628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius * the network is present. 66865628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius * @param ssid |wpa_ssid| struct corresponding to the network. 66965628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius * @param type type of request. 67065628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius * @param param addition params associated with the request. 67165628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius */ 67257ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusint HidlManager::notifyNetworkRequest( 67365628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid, int type, 67465628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius const char *param) 67565628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius{ 67665628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius if (!wpa_s || !ssid) 67765628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius return 1; 67865628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius 67965628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius const std::string network_key = 68065628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius getNetworkObjectMapKey(wpa_s->ifname, ssid->id); 681ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (sta_network_object_map_.find(network_key) == 682ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius sta_network_object_map_.end()) 68365628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius return 1; 68465628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius 6858366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius if (type == WPA_CTRL_REQ_EAP_IDENTITY) { 6868366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius callWithEachStaNetworkCallback( 6878366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius wpa_s->ifname, ssid->id, 6888366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::bind( 6898366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius &ISupplicantStaNetworkCallback:: 6908366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius onNetworkEapIdentityRequest, 6918366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::placeholders::_1)); 6928366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 0; 6938366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 6948366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius if (type == WPA_CTRL_REQ_SIM) { 6958366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::vector<hidl_array<uint8_t, 16>> gsm_rands; 6968366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius hidl_array<uint8_t, 16> umts_rand; 6978366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius hidl_array<uint8_t, 16> umts_autn; 6988366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius if (!parseGsmAuthNetworkRequest(param, &gsm_rands)) { 6998366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius ISupplicantStaNetworkCallback:: 7008366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius NetworkRequestEapSimGsmAuthParams hidl_params; 7018366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius hidl_params.rands = gsm_rands; 7028366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius callWithEachStaNetworkCallback( 7038366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius wpa_s->ifname, ssid->id, 7048366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::bind( 7058366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius &ISupplicantStaNetworkCallback:: 7068366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius onNetworkEapSimGsmAuthRequest, 7078366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::placeholders::_1, hidl_params)); 7088366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 0; 7098366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 7108366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius if (!parseUmtsAuthNetworkRequest( 7118366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius param, &umts_rand, &umts_autn)) { 7128366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius ISupplicantStaNetworkCallback:: 7138366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius NetworkRequestEapSimUmtsAuthParams hidl_params; 7148366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius hidl_params.rand = umts_rand; 7158366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius hidl_params.autn = umts_autn; 7168366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius callWithEachStaNetworkCallback( 7178366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius wpa_s->ifname, ssid->id, 7188366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::bind( 7198366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius &ISupplicantStaNetworkCallback:: 7208366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius onNetworkEapSimUmtsAuthRequest, 7218366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::placeholders::_1, hidl_params)); 7228366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 0; 7238366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 7248366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 7258366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 1; 72665628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius} 72765628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius 72865628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius/** 7299322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * Notify all listeners about the end of an ANQP query. 7309322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * 7319322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface. 7329322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param bssid BSSID of the access point. 7339322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param result Result of the operation ("SUCCESS" or "FAILURE"). 7349322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param anqp |wpa_bss_anqp| ANQP data fetched. 7359322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius */ 7369322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Piusvoid HidlManager::notifyAnqpQueryDone( 7379322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius struct wpa_supplicant *wpa_s, const u8 *bssid, const char *result, 7389322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius const struct wpa_bss_anqp *anqp) 7399322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius{ 7409322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius if (!wpa_s || !bssid || !result || !anqp) 7419322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius return; 7429322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 743fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 744fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 7459322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius return; 7469322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 7479322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius ISupplicantStaIfaceCallback::AnqpData hidl_anqp_data; 7489322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius ISupplicantStaIfaceCallback::Hs20AnqpData hidl_hs20_anqp_data; 7499322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius if (std::string(result) == "SUCCESS") { 7509322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_anqp_data.venueName = 7518894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius misc_utils::convertWpaBufToVector(anqp->venue_name); 7529322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_anqp_data.roamingConsortium = 7538894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius misc_utils::convertWpaBufToVector(anqp->roaming_consortium); 7549322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_anqp_data.ipAddrTypeAvailability = 7558894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius misc_utils::convertWpaBufToVector( 7568894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius anqp->ip_addr_type_availability); 7579322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_anqp_data.naiRealm = 7588894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius misc_utils::convertWpaBufToVector(anqp->nai_realm); 7599322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_anqp_data.anqp3gppCellularNetwork = 7608894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius misc_utils::convertWpaBufToVector(anqp->anqp_3gpp); 7619322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_anqp_data.domainName = 7628894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius misc_utils::convertWpaBufToVector(anqp->domain_name); 7639322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 7649322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_hs20_anqp_data.operatorFriendlyName = 7658894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius misc_utils::convertWpaBufToVector( 7668894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius anqp->hs20_operator_friendly_name); 7679322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_hs20_anqp_data.wanMetrics = 7688894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius misc_utils::convertWpaBufToVector(anqp->hs20_wan_metrics); 7699322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_hs20_anqp_data.connectionCapability = 7708894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius misc_utils::convertWpaBufToVector( 7718894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius anqp->hs20_connection_capability); 7729322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_hs20_anqp_data.osuProvidersList = 7738894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius misc_utils::convertWpaBufToVector( 7748894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius anqp->hs20_osu_providers_list); 7759322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius } 7769322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 7779322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius callWithEachStaIfaceCallback( 7789322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius wpa_s->ifname, std::bind( 7799322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius &ISupplicantStaIfaceCallback::onAnqpQueryDone, 780fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, bssid, hidl_anqp_data, 781fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius hidl_hs20_anqp_data)); 7829322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius} 7839322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 7849322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius/** 7859322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * Notify all listeners about the end of an HS20 icon query. 7869322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * 7879322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface. 7889322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param bssid BSSID of the access point. 7899322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param file_name Name of the icon file. 7909322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param image Raw bytes of the icon file. 7919322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param image_length Size of the the icon file. 7929322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius */ 7939322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Piusvoid HidlManager::notifyHs20IconQueryDone( 7949322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius struct wpa_supplicant *wpa_s, const u8 *bssid, const char *file_name, 7959322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius const u8 *image, u32 image_length) 7969322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius{ 7979322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius if (!wpa_s || !bssid || !file_name || !image) 7989322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius return; 7999322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 800fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 801fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 8029322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius return; 8039322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 8049322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius callWithEachStaIfaceCallback( 8059322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius wpa_s->ifname, 8069322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius std::bind( 8079322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius &ISupplicantStaIfaceCallback::onHs20IconQueryDone, 808fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, bssid, file_name, 809fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::vector<uint8_t>(image, image + image_length))); 8109322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius} 8119322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 8129322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius/** 8139322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * Notify all listeners about the reception of HS20 subscription 8149322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * remediation notification from the server. 8159322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * 8169322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface. 8179322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param url URL of the server. 8189322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param osu_method OSU method (OMA_DM or SOAP_XML_SPP). 8199322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius */ 8209322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Piusvoid HidlManager::notifyHs20RxSubscriptionRemediation( 8219322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius struct wpa_supplicant *wpa_s, const char *url, u8 osu_method) 8229322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius{ 8239322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius if (!wpa_s || !url) 8249322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius return; 8259322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 826fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 827fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 8289322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius return; 8299322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 8309322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius ISupplicantStaIfaceCallback::OsuMethod hidl_osu_method = {}; 8319322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius if (osu_method & 0x1) { 8329322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_osu_method = 8339322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius ISupplicantStaIfaceCallback::OsuMethod::OMA_DM; 8349322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius } else if (osu_method & 0x2) { 8359322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_osu_method = 8369322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius ISupplicantStaIfaceCallback::OsuMethod::SOAP_XML_SPP; 8379322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius } 8389322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius callWithEachStaIfaceCallback( 8399322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius wpa_s->ifname, 8409322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius std::bind( 8419322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius &ISupplicantStaIfaceCallback::onHs20SubscriptionRemediation, 84216df495ccd197921e6cc88094cf0e1ff908b0105Roshan Pius std::placeholders::_1, wpa_s->bssid, hidl_osu_method, url)); 8439322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius} 8449322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 8459322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius/** 8469322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * Notify all listeners about the reception of HS20 immient deauth 8479322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * notification from the server. 8489322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * 8499322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface. 8509322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param code Deauth reason code sent from server. 8519322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param reauth_delay Reauthentication delay in seconds sent from server. 8529322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param url URL of the server. 8539322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius */ 8549322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Piusvoid HidlManager::notifyHs20RxDeauthImminentNotice( 8559322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius struct wpa_supplicant *wpa_s, u8 code, u16 reauth_delay, const char *url) 8569322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius{ 8579322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius if (!wpa_s || !url) 8589322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius return; 8599322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 860fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 861fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 8629322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius return; 8639322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 8649322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius callWithEachStaIfaceCallback( 8659322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius wpa_s->ifname, 8669322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius std::bind( 8679322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius &ISupplicantStaIfaceCallback::onHs20DeauthImminentNotice, 86816df495ccd197921e6cc88094cf0e1ff908b0105Roshan Pius std::placeholders::_1, wpa_s->bssid, code, reauth_delay, url)); 8699322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius} 8709322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 8719322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius/** 8720974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * Notify all listeners about the reason code for disconnection from the 8730974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * currently connected network. 8740974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * 8750974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface on which 8760974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * the network is present. 8770974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius */ 8780974e961cd7bac71cf4d5919551e84541abf2b38Roshan Piusvoid HidlManager::notifyDisconnectReason(struct wpa_supplicant *wpa_s) 8790974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius{ 8800974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius if (!wpa_s) 8810974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius return; 8820974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius 883fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 884fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 8850974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius return; 8860974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius 8870974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius const u8 *bssid = wpa_s->bssid; 8880974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius if (is_zero_ether_addr(bssid)) { 8890974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius bssid = wpa_s->pending_bssid; 8900974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius } 8910974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius 8920974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius callWithEachStaIfaceCallback( 8930974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius wpa_s->ifname, 8940974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius std::bind( 8950974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius &ISupplicantStaIfaceCallback::onDisconnected, 896fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, bssid, wpa_s->disconnect_reason < 0, 8971ae7e6afc2787a108170909e37b24c6e9c128795Roshan Pius static_cast<ISupplicantStaIfaceCallback::ReasonCode>( 8981ae7e6afc2787a108170909e37b24c6e9c128795Roshan Pius wpa_s->disconnect_reason))); 8990974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius} 9000974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius 9010974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius/** 9020974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * Notify all listeners about association reject from the access point to which 9030974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * we are attempting to connect. 9040974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * 9050974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface on which 9060974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * the network is present. 9070974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius */ 9080974e961cd7bac71cf4d5919551e84541abf2b38Roshan Piusvoid HidlManager::notifyAssocReject(struct wpa_supplicant *wpa_s) 9090974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius{ 9100974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius if (!wpa_s) 9110974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius return; 9120974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius 913fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 914fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 9150974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius return; 9160974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius 9170974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius const u8 *bssid = wpa_s->bssid; 9180974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius if (is_zero_ether_addr(bssid)) { 9190974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius bssid = wpa_s->pending_bssid; 9200974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius } 9210974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius 9220974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius callWithEachStaIfaceCallback( 9230974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius wpa_s->ifname, 9240974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius std::bind( 9250974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius &ISupplicantStaIfaceCallback::onAssociationRejected, 9261ae7e6afc2787a108170909e37b24c6e9c128795Roshan Pius std::placeholders::_1, bssid, 9271ae7e6afc2787a108170909e37b24c6e9c128795Roshan Pius static_cast<ISupplicantStaIfaceCallback::StatusCode>( 9281ae7e6afc2787a108170909e37b24c6e9c128795Roshan Pius wpa_s->assoc_status_code), 929807bc58f434d07965509d3d491dafd07c4431a55Roshan Pius wpa_s->assoc_timed_out == 1)); 9300974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius} 9310974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius 93238e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Piusvoid HidlManager::notifyAuthTimeout(struct wpa_supplicant *wpa_s) 93338e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius{ 93438e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius if (!wpa_s) 93538e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius return; 93638e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius 93738e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius const std::string ifname(wpa_s->ifname); 93838e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius if (sta_iface_object_map_.find(ifname) == sta_iface_object_map_.end()) 93938e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius return; 94038e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius 94138e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius const u8 *bssid = wpa_s->bssid; 94238e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius if (is_zero_ether_addr(bssid)) { 94338e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius bssid = wpa_s->pending_bssid; 94438e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius } 94538e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius std::array<uint8_t, ETH_ALEN> hidl_bssid; 94638e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius os_memcpy(hidl_bssid.data(), bssid, ETH_ALEN); 94738e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius 94838e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius callWithEachStaIfaceCallback( 94938e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius wpa_s->ifname, 95038e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius std::bind( 95138e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius &ISupplicantStaIfaceCallback::onAuthenticationTimeout, 95238e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius std::placeholders::_1, hidl_bssid)); 95338e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius} 95438e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius 955149327590e009d96301e69772e717e227215d5acRoshan Piusvoid HidlManager::notifyWpsEventFail( 956149327590e009d96301e69772e717e227215d5acRoshan Pius struct wpa_supplicant *wpa_s, uint8_t *peer_macaddr, uint16_t config_error, 957149327590e009d96301e69772e717e227215d5acRoshan Pius uint16_t error_indication) 958149327590e009d96301e69772e717e227215d5acRoshan Pius{ 959149327590e009d96301e69772e717e227215d5acRoshan Pius if (!wpa_s || !peer_macaddr) 960149327590e009d96301e69772e717e227215d5acRoshan Pius return; 961149327590e009d96301e69772e717e227215d5acRoshan Pius 962fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 963fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 964149327590e009d96301e69772e717e227215d5acRoshan Pius return; 965149327590e009d96301e69772e717e227215d5acRoshan Pius 966149327590e009d96301e69772e717e227215d5acRoshan Pius callWithEachStaIfaceCallback( 967fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 968fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 969fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantStaIfaceCallback::onWpsEventFail, 970fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, peer_macaddr, 971fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius static_cast<ISupplicantStaIfaceCallback::WpsConfigError>( 972fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius config_error), 973fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius static_cast<ISupplicantStaIfaceCallback::WpsErrorIndication>( 974fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius error_indication))); 975149327590e009d96301e69772e717e227215d5acRoshan Pius} 976149327590e009d96301e69772e717e227215d5acRoshan Pius 977149327590e009d96301e69772e717e227215d5acRoshan Piusvoid HidlManager::notifyWpsEventSuccess(struct wpa_supplicant *wpa_s) 978149327590e009d96301e69772e717e227215d5acRoshan Pius{ 979149327590e009d96301e69772e717e227215d5acRoshan Pius if (!wpa_s) 980149327590e009d96301e69772e717e227215d5acRoshan Pius return; 981149327590e009d96301e69772e717e227215d5acRoshan Pius 982fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 983fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 984149327590e009d96301e69772e717e227215d5acRoshan Pius return; 985149327590e009d96301e69772e717e227215d5acRoshan Pius 986149327590e009d96301e69772e717e227215d5acRoshan Pius callWithEachStaIfaceCallback( 987149327590e009d96301e69772e717e227215d5acRoshan Pius wpa_s->ifname, std::bind( 988149327590e009d96301e69772e717e227215d5acRoshan Pius &ISupplicantStaIfaceCallback::onWpsEventSuccess, 989149327590e009d96301e69772e717e227215d5acRoshan Pius std::placeholders::_1)); 990149327590e009d96301e69772e717e227215d5acRoshan Pius} 991149327590e009d96301e69772e717e227215d5acRoshan Pius 992149327590e009d96301e69772e717e227215d5acRoshan Piusvoid HidlManager::notifyWpsEventPbcOverlap(struct wpa_supplicant *wpa_s) 993149327590e009d96301e69772e717e227215d5acRoshan Pius{ 994149327590e009d96301e69772e717e227215d5acRoshan Pius if (!wpa_s) 995149327590e009d96301e69772e717e227215d5acRoshan Pius return; 996149327590e009d96301e69772e717e227215d5acRoshan Pius 997fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 998fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 999149327590e009d96301e69772e717e227215d5acRoshan Pius return; 1000149327590e009d96301e69772e717e227215d5acRoshan Pius 1001149327590e009d96301e69772e717e227215d5acRoshan Pius callWithEachStaIfaceCallback( 10026a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius wpa_s->ifname, 10036a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius std::bind( 10046a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius &ISupplicantStaIfaceCallback::onWpsEventPbcOverlap, 10056a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius std::placeholders::_1)); 1006149327590e009d96301e69772e717e227215d5acRoshan Pius} 1007149327590e009d96301e69772e717e227215d5acRoshan Pius 1008fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pDeviceFound( 1009fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const u8 *addr, 1010fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius const struct p2p_peer_info *info, const u8 *peer_wfd_device_info, 1011fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius u8 peer_wfd_device_info_len) 1012fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1013fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !addr || !info || !peer_wfd_device_info) 1014fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1015fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1016fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1017fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1018fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1019fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1020fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (peer_wfd_device_info_len != kWfdDeviceInfoLen) { 1021fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_printf( 1022fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius MSG_ERROR, "Unexpected WFD device info len: %d", 1023fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius peer_wfd_device_info_len); 1024fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius } 1025fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1026fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1027fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1028fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1029fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onDeviceFound, 1030fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, addr, info->p2p_device_addr, 1031fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius info->pri_dev_type, info->device_name, info->config_methods, 1032fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius info->dev_capab, info->group_capab, peer_wfd_device_info)); 1033fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1034fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1035fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pDeviceLost( 1036fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const u8 *p2p_device_addr) 1037fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1038fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !p2p_device_addr) 1039fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1040fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1041fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1042fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1043fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1044fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1045fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1046fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, std::bind( 1047fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onDeviceLost, 1048fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, p2p_device_addr)); 1049fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1050fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1051fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pFindStopped(struct wpa_supplicant *wpa_s) 1052fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1053fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s) 1054fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1055fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1056fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1057fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1058fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1059fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1060fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1061fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, std::bind( 1062fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onFindStopped, 1063fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1)); 1064fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1065fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1066fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pGoNegReq( 1067fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const u8 *src_addr, u16 dev_passwd_id, 1068fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius u8 /* go_intent */) 1069fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1070fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !src_addr) 1071fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1072fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1073fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1074fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1075fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1076fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1077fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1078fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1079fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1080fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onGoNegotiationRequest, 1081fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, src_addr, 1082fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius static_cast<ISupplicantP2pIfaceCallback::WpsDevPasswordId>( 1083fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius dev_passwd_id))); 1084fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1085fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1086fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pGoNegCompleted( 1087fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const struct p2p_go_neg_results *res) 1088fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1089fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !res) 1090fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1091fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1092fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1093fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1094fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1095fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1096fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1097fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1098fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1099fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onGoNegotiationCompleted, 1100fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, 1101fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius static_cast<ISupplicantP2pIfaceCallback::P2pStatusCode>( 1102fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius res->status))); 1103fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1104fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1105fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pGroupFormationFailure( 1106fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const char *reason) 1107fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1108fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !reason) 1109fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1110fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1111fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1112fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1113fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1114fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1115fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1116fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1117fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1118fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onGroupFormationFailure, 1119fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, reason)); 1120fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1121fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1122fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pGroupStarted( 1123fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_group_s, const struct wpa_ssid *ssid, 1124fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius int persistent, int client, const u8 *ip) 1125fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1126fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_group_s || !wpa_group_s->parent || !ssid || !ip) 1127fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1128fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1129fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius // For group notifications, need to use the parent iface for callbacks. 1130fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s = wpa_group_s->parent; 1131fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1132fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1133fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1134fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1135fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius uint32_t hidl_freq = wpa_group_s->current_bss 1136fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius ? wpa_group_s->current_bss->freq 1137fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius : wpa_group_s->assoc_freq; 1138fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::array<uint8_t, 32> hidl_psk; 1139fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (ssid->psk_set) { 1140fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius os_memcpy(hidl_psk.data(), ssid->psk, 32); 1141fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius } 1142fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius bool hidl_is_go = (client == 0 ? true : false); 1143fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius bool hidl_is_persistent = (persistent == 1 ? true : false); 1144fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1145fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1146fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1147fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1148fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onGroupStarted, 1149fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, wpa_group_s->ifname, hidl_is_go, 1150fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::vector<uint8_t>{ssid->ssid, ssid->ssid + ssid->ssid_len}, 1151fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius hidl_freq, hidl_psk, ssid->passphrase, wpa_group_s->go_dev_addr, 1152fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius hidl_is_persistent)); 1153fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1154fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1155fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pGroupRemoved( 1156fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_group_s, const struct wpa_ssid *ssid, 1157fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius const char *role) 1158fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1159fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_group_s || !wpa_group_s->parent || !ssid || !role) 1160fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1161fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1162fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius // For group notifications, need to use the parent iface for callbacks. 1163fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s = wpa_group_s->parent; 1164fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1165fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1166fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1167fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1168fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius bool hidl_is_go = (std::string(role) == "GO"); 1169fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1170fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1171fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1172fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1173fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onGroupRemoved, 1174fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, wpa_group_s->ifname, hidl_is_go)); 1175fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1176fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1177fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pInvitationReceived( 1178fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const u8 *sa, const u8 *go_dev_addr, 1179fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius const u8 *bssid, int id, int op_freq) 1180fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1181fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !sa || !go_dev_addr || !bssid) 1182fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1183fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1184fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1185fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1186fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1187fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1188fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius SupplicantNetworkId hidl_network_id; 1189fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (id < 0) { 1190fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius hidl_network_id = UINT32_MAX; 1191fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius } 1192fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius hidl_network_id = id; 1193fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1194fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1195fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1196fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1197fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onInvitationReceived, 1198fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, sa, go_dev_addr, bssid, hidl_network_id, 1199fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius op_freq)); 1200fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1201fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1202fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pInvitationResult( 1203fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, int status, const u8 *bssid) 1204fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1205fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !bssid) 1206fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1207fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1208fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1209fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1210fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1211fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1212fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1213fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1214fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1215fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onInvitationResult, 1216fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, bssid, 1217fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius static_cast<ISupplicantP2pIfaceCallback::P2pStatusCode>( 1218fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius status))); 1219fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1220fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1221fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pProvisionDiscovery( 1222fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const u8 *dev_addr, int request, 1223fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius enum p2p_prov_disc_status status, u16 config_methods, 1224fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius unsigned int generated_pin) 1225fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1226fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !dev_addr) 1227fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1228fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1229fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1230fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1231fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1232fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1233fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::string hidl_generated_pin; 1234fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (generated_pin > 0) { 1235235f7da827f7236c90f837b5604a026d3f61b8a1Roshan Pius hidl_generated_pin = 1236235f7da827f7236c90f837b5604a026d3f61b8a1Roshan Pius misc_utils::convertWpsPinToString(generated_pin); 1237fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius } 1238fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius bool hidl_is_request = (request == 1 ? true : false); 1239fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1240fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1241fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1242fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1243fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onProvisionDiscoveryCompleted, 1244fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, dev_addr, hidl_is_request, 1245fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius static_cast<ISupplicantP2pIfaceCallback::P2pProvDiscStatusCode>( 1246fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius status), 1247fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius config_methods, hidl_generated_pin)); 1248fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1249fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1250fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pSdResponse( 1251fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const u8 *sa, u16 update_indic, 1252fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius const u8 *tlvs, size_t tlvs_len) 1253fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1254fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !sa || !tlvs) 1255fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1256fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1257fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1258fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1259fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1260fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1261fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1262fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1263fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1264fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onServiceDiscoveryResponse, 1265fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, sa, update_indic, 1266fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::vector<uint8_t>{tlvs, tlvs + tlvs_len})); 1267fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1268fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1269fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyApStaAuthorized( 1270fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const u8 *sta, const u8 *p2p_dev_addr) 1271fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1272fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !sta || !p2p_dev_addr) 1273fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1274fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1275fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1276fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1277fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1278fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1279fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1280fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, std::bind( 1281fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onStaAuthorized, 1282fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, sta, p2p_dev_addr)); 1283fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1284fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1285fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyApStaDeauthorized( 1286fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const u8 *sta, const u8 *p2p_dev_addr) 1287fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1288fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !sta || !p2p_dev_addr) 1289fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1290fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1291fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1292fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1293fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1294fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1295fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1296fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, std::bind( 1297fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onStaDeauthorized, 1298fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, sta, p2p_dev_addr)); 1299fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1300fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 130194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piusvoid HidlManager::notifyExtRadioWorkStart( 130294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius struct wpa_supplicant *wpa_s, uint32_t id) 130394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{ 130494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius if (!wpa_s) 130594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius return; 130694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 1307fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 1308fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 130994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius return; 131094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 131194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius callWithEachStaIfaceCallback( 131294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius wpa_s->ifname, 131394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius std::bind( 131494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius &ISupplicantStaIfaceCallback::onExtRadioWorkStart, 131594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius std::placeholders::_1, id)); 131694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius} 131794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 131894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piusvoid HidlManager::notifyExtRadioWorkTimeout( 131994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius struct wpa_supplicant *wpa_s, uint32_t id) 132094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{ 132194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius if (!wpa_s) 132294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius return; 132394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 1324fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 1325fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 132694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius return; 132794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 132894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius callWithEachStaIfaceCallback( 132994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius wpa_s->ifname, 133094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius std::bind( 133194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius &ISupplicantStaIfaceCallback::onExtRadioWorkTimeout, 133294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius std::placeholders::_1, id)); 133394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius} 133494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 13350974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius/** 1336ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Retrieve the |ISupplicantP2pIface| hidl object reference using the provided 1337ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * ifname. 1338ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1339ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param ifname Name of the corresponding interface. 1340ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param iface_object Hidl reference corresponding to the iface. 1341ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1342ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @return 0 on success, 1 on failure. 1343ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius */ 1344ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint HidlManager::getP2pIfaceHidlObjectByIfname( 1345ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, android::sp<ISupplicantP2pIface> *iface_object) 1346ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 1347ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (ifname.empty() || !iface_object) 1348ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 1349ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 1350ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto iface_object_iter = p2p_iface_object_map_.find(ifname); 1351ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (iface_object_iter == p2p_iface_object_map_.end()) 1352ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 1353ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 1354ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius *iface_object = iface_object_iter->second; 1355ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 0; 1356ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 1357ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 1358ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius/** 1359ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Retrieve the |ISupplicantStaIface| hidl object reference using the provided 13608e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * ifname. 136132c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * 136232c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * @param ifname Name of the corresponding interface. 136357ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * @param iface_object Hidl reference corresponding to the iface. 136432c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * 136532c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * @return 0 on success, 1 on failure. 136632c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius */ 1367ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint HidlManager::getStaIfaceHidlObjectByIfname( 1368ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, android::sp<ISupplicantStaIface> *iface_object) 1369e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt{ 137032c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius if (ifname.empty() || !iface_object) 1371e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return 1; 1372e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 1373ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto iface_object_iter = sta_iface_object_map_.find(ifname); 1374ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (iface_object_iter == sta_iface_object_map_.end()) 1375e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return 1; 1376e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 13778e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius *iface_object = iface_object_iter->second; 1378e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return 0; 1379e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt} 1380e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 1381d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius/** 1382ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Retrieve the |ISupplicantP2pNetwork| hidl object reference using the provided 13838e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * ifname and network_id. 1384d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * 1385d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @param ifname Name of the corresponding interface. 1386d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @param network_id ID of the corresponding network. 138757ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * @param network_object Hidl reference corresponding to the network. 1388d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * 1389d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @return 0 on success, 1 on failure. 1390d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius */ 1391ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint HidlManager::getP2pNetworkHidlObjectByIfnameAndNetworkId( 1392d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius const std::string &ifname, int network_id, 1393ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius android::sp<ISupplicantP2pNetwork> *network_object) 1394d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius{ 1395d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius if (ifname.empty() || network_id < 0 || !network_object) 1396d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius return 1; 1397d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 1398d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius // Generate the key to be used to lookup the network. 1399d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius const std::string network_key = 1400d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius getNetworkObjectMapKey(ifname, network_id); 1401d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 1402ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto network_object_iter = p2p_network_object_map_.find(network_key); 1403ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (network_object_iter == p2p_network_object_map_.end()) 1404ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 1405ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 1406ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius *network_object = network_object_iter->second; 1407ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 0; 1408ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 1409ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 1410ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius/** 1411ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Retrieve the |ISupplicantStaNetwork| hidl object reference using the provided 1412ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * ifname and network_id. 1413ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1414ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param ifname Name of the corresponding interface. 1415ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param network_id ID of the corresponding network. 1416ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param network_object Hidl reference corresponding to the network. 1417ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1418ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @return 0 on success, 1 on failure. 1419ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius */ 1420ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint HidlManager::getStaNetworkHidlObjectByIfnameAndNetworkId( 1421ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, int network_id, 1422ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius android::sp<ISupplicantStaNetwork> *network_object) 1423ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 1424ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (ifname.empty() || network_id < 0 || !network_object) 1425ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 1426ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 1427ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Generate the key to be used to lookup the network. 1428ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string network_key = 1429ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius getNetworkObjectMapKey(ifname, network_id); 1430ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 1431ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto network_object_iter = sta_network_object_map_.find(network_key); 1432ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (network_object_iter == sta_network_object_map_.end()) 1433d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius return 1; 1434d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 14358e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius *network_object = network_object_iter->second; 1436d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius return 0; 1437d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius} 1438d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 1439d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius/** 144057ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * Add a new |ISupplicantCallback| hidl object reference to our 14410470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * global callback list. 14420470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * 144357ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * @param callback Hidl reference of the |ISupplicantCallback| object. 14440470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * 14450470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * @return 0 on success, 1 on failure. 14460470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius */ 144757ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusint HidlManager::addSupplicantCallbackHidlObject( 14487c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius const android::sp<ISupplicantCallback> &callback) 14490470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius{ 14508e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius // Register for death notification before we add it to our list. 145157ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius auto on_hidl_died_fctor = std::bind( 145257ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius &HidlManager::removeSupplicantCallbackHidlObject, this, 14538e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius std::placeholders::_1); 145457ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius return registerForDeathAndAddCallbackHidlObjectToList< 14557c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius ISupplicantCallback>( 145657ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius callback, on_hidl_died_fctor, supplicant_callbacks_); 14570470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius} 1458ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 14590470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius/** 1460ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Add a new iface callback hidl object reference to our 14610470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * interface callback list. 14620470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * 14630470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * @param ifname Name of the corresponding interface. 1464ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param callback Hidl reference of the callback object. 14650470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * 14660470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * @return 0 on success, 1 on failure. 14670470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius */ 1468ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint HidlManager::addP2pIfaceCallbackHidlObject( 14690470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius const std::string &ifname, 1470ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantP2pIfaceCallback> &callback) 14710470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius{ 1472ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function<void( 1473ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantP2pIfaceCallback> &)> 1474ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius on_hidl_died_fctor = std::bind( 1475ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &HidlManager::removeP2pIfaceCallbackHidlObject, this, ifname, 1476ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::placeholders::_1); 1477ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return addIfaceCallbackHidlObjectToMap( 1478ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, callback, on_hidl_died_fctor, p2p_iface_callbacks_map_); 1479ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 14808e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius 1481ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius/** 1482ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Add a new iface callback hidl object reference to our 1483ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * interface callback list. 1484ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1485ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param ifname Name of the corresponding interface. 1486ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param callback Hidl reference of the callback object. 1487ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1488ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @return 0 on success, 1 on failure. 1489ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius */ 1490ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint HidlManager::addStaIfaceCallbackHidlObject( 1491ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, 1492ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantStaIfaceCallback> &callback) 1493ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 1494ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function<void( 1495ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantStaIfaceCallback> &)> 1496ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius on_hidl_died_fctor = std::bind( 1497ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &HidlManager::removeStaIfaceCallbackHidlObject, this, ifname, 1498ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::placeholders::_1); 1499ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return addIfaceCallbackHidlObjectToMap( 1500ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, callback, on_hidl_died_fctor, sta_iface_callbacks_map_); 15010470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius} 15020470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius 15030470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius/** 1504ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Add a new network callback hidl object reference to our network callback 1505ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * list. 15060470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * 15070470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * @param ifname Name of the corresponding interface. 15080470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * @param network_id ID of the corresponding network. 1509ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param callback Hidl reference of the callback object. 15100470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * 15110470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * @return 0 on success, 1 on failure. 15120470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius */ 1513ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint HidlManager::addP2pNetworkCallbackHidlObject( 15140470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius const std::string &ifname, int network_id, 1515ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantP2pNetworkCallback> &callback) 15160470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius{ 1517ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function<void( 1518ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantP2pNetworkCallback> &)> 1519ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius on_hidl_died_fctor = std::bind( 1520ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &HidlManager::removeP2pNetworkCallbackHidlObject, this, ifname, 1521ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius network_id, std::placeholders::_1); 1522ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return addNetworkCallbackHidlObjectToMap( 1523ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, network_id, callback, on_hidl_died_fctor, 1524ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius p2p_network_callbacks_map_); 15250470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius} 15260470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius 15270470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius/** 1528ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Add a new network callback hidl object reference to our network callback 1529ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * list. 1530d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * 1531d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @param ifname Name of the corresponding interface. 1532d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @param network_id ID of the corresponding network. 1533ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param callback Hidl reference of the callback object. 1534ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1535ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @return 0 on success, 1 on failure. 1536d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius */ 1537ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint HidlManager::addStaNetworkCallbackHidlObject( 1538ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, int network_id, 1539ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantStaNetworkCallback> &callback) 1540d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius{ 1541ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function<void( 1542ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantStaNetworkCallback> &)> 1543ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius on_hidl_died_fctor = std::bind( 1544ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &HidlManager::removeStaNetworkCallbackHidlObject, this, ifname, 1545ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius network_id, std::placeholders::_1); 1546ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return addNetworkCallbackHidlObjectToMap( 1547ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, network_id, callback, on_hidl_died_fctor, 1548ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius sta_network_callbacks_map_); 1549d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius} 15508e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius 15518e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius/** 155257ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * Removes the provided |ISupplicantCallback| hidl object reference 15538e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * from our global callback list. 15548e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * 155557ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * @param callback Hidl reference of the |ISupplicantCallback| object. 15568e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius */ 155757ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusvoid HidlManager::removeSupplicantCallbackHidlObject( 15587c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius const android::sp<ISupplicantCallback> &callback) 15598e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius{ 15608e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius supplicant_callbacks_.erase( 15618e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius std::remove( 15628e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius supplicant_callbacks_.begin(), supplicant_callbacks_.end(), 15638e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius callback), 15648e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius supplicant_callbacks_.end()); 15658e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius} 15668e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius 15678e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius/** 1568ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Removes the provided iface callback hidl object reference from 15698e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * our interface callback list. 15708e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * 15718e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * @param ifname Name of the corresponding interface. 1572ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param callback Hidl reference of the callback object. 15738e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius */ 1574ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid HidlManager::removeP2pIfaceCallbackHidlObject( 15758e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius const std::string &ifname, 1576ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantP2pIfaceCallback> &callback) 15778e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius{ 1578ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return removeIfaceCallbackHidlObjectFromMap( 1579ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, callback, p2p_iface_callbacks_map_); 1580ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 15818e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius 1582ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius/** 1583ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Removes the provided iface callback hidl object reference from 1584ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * our interface callback list. 1585ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1586ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param ifname Name of the corresponding interface. 1587ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param callback Hidl reference of the callback object. 1588ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius */ 1589ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid HidlManager::removeStaIfaceCallbackHidlObject( 1590ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, 1591ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantStaIfaceCallback> &callback) 1592ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 1593ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return removeIfaceCallbackHidlObjectFromMap( 1594ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, callback, sta_iface_callbacks_map_); 15958e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius} 15968e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius 15978e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius/** 1598ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Removes the provided network callback hidl object reference from 15998e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * our network callback list. 16008e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * 16018e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * @param ifname Name of the corresponding interface. 16028e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * @param network_id ID of the corresponding network. 1603ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param callback Hidl reference of the callback object. 16048e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius */ 1605ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid HidlManager::removeP2pNetworkCallbackHidlObject( 16068e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius const std::string &ifname, int network_id, 1607ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantP2pNetworkCallback> &callback) 16088e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius{ 1609ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return removeNetworkCallbackHidlObjectFromMap( 1610ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, network_id, callback, p2p_network_callbacks_map_); 16118e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius} 16128e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius 16138e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius/** 1614ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Removes the provided network callback hidl object reference from 1615ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * our network callback list. 16168e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * 1617ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param ifname Name of the corresponding interface. 1618ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param network_id ID of the corresponding network. 1619ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param callback Hidl reference of the callback object. 16208e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius */ 1621ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid HidlManager::removeStaNetworkCallbackHidlObject( 1622ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, int network_id, 1623ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantStaNetworkCallback> &callback) 16248e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius{ 1625ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return removeNetworkCallbackHidlObjectFromMap( 1626ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, network_id, callback, sta_network_callbacks_map_); 16278e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius} 16282d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius 16292d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius/** 16302d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * Helper function to invoke the provided callback method on all the 163157ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * registered |ISupplicantCallback| callback hidl objects. 16322d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * 163357ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * @param method Pointer to the required hidl method from 16342d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * |ISupplicantCallback|. 16352d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius */ 163657ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusvoid HidlManager::callWithEachSupplicantCallback( 16377c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius const std::function<Return<void>(android::sp<ISupplicantCallback>)> &method) 16382d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius{ 16392d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius for (const auto &callback : supplicant_callbacks_) { 1640cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius if (!method(callback).isOk()) { 1641cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius wpa_printf(MSG_ERROR, "Failed to invoke HIDL callback"); 1642cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius } 16432d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius } 16442d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius} 16452d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius 16462d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius/** 16472d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * Helper fucntion to invoke the provided callback method on all the 1648ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * registered iface callback hidl objects for the specified 16492d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * |ifname|. 16502d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * 16512d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * @param ifname Name of the corresponding interface. 16527c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * @param method Pointer to the required hidl method from 16537c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * |ISupplicantIfaceCallback|. 16542d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius */ 1655ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid HidlManager::callWithEachP2pIfaceCallback( 16562d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius const std::string &ifname, 1657ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function<Return<void>(android::sp<ISupplicantP2pIfaceCallback>)> 16587c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius &method) 16592d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius{ 1660ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callWithEachIfaceCallback(ifname, method, p2p_iface_callbacks_map_); 1661ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 16622d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius 1663ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius/** 1664ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Helper fucntion to invoke the provided callback method on all the 1665ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * registered iface callback hidl objects for the specified 1666ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * |ifname|. 1667ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1668ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param ifname Name of the corresponding interface. 1669ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param method Pointer to the required hidl method from 1670ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * |ISupplicantIfaceCallback|. 1671ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius */ 1672ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid HidlManager::callWithEachStaIfaceCallback( 1673ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, 1674ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function<Return<void>(android::sp<ISupplicantStaIfaceCallback>)> 1675ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &method) 1676ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 1677ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callWithEachIfaceCallback(ifname, method, sta_iface_callbacks_map_); 16782d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius} 16792d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius 16802d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius/** 16812d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * Helper function to invoke the provided callback method on all the 1682ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * registered network callback hidl objects for the specified 16832d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * |ifname| & |network_id|. 16842d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * 16852d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * @param ifname Name of the corresponding interface. 16862d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * @param network_id ID of the corresponding network. 16877c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * @param method Pointer to the required hidl method from 1688ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * |ISupplicantP2pNetworkCallback| or |ISupplicantStaNetworkCallback| . 16892d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius */ 1690ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid HidlManager::callWithEachP2pNetworkCallback( 16912d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius const std::string &ifname, int network_id, 1692ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function< 1693ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius Return<void>(android::sp<ISupplicantP2pNetworkCallback>)> &method) 16942d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius{ 1695ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callWithEachNetworkCallback( 1696ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, network_id, method, p2p_network_callbacks_map_); 16972d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius} 16987c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 1699ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius/** 1700ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Helper function to invoke the provided callback method on all the 1701ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * registered network callback hidl objects for the specified 1702ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * |ifname| & |network_id|. 1703ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1704ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param ifname Name of the corresponding interface. 1705ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param network_id ID of the corresponding network. 1706ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param method Pointer to the required hidl method from 1707ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * |ISupplicantP2pNetworkCallback| or |ISupplicantStaNetworkCallback| . 1708ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius */ 1709ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid HidlManager::callWithEachStaNetworkCallback( 1710ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, int network_id, 1711ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function< 1712ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius Return<void>(android::sp<ISupplicantStaNetworkCallback>)> &method) 1713ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 1714ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callWithEachNetworkCallback( 1715ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, network_id, method, sta_network_callbacks_map_); 1716ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 17177c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace implementation 17187c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace V1_0 17197c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace wifi 17207c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace supplicant 17217c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace hardware 17227c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace android 1723