hidl_manager.cpp revision cfb7d5e3997bb4355027453d9a1e0fd9fbc55637
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" 14e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 158366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piusextern "C" { 168366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius#include "src/eap_common/eap_sim_common.h" 178366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius} 188366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius 19ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusnamespace { 208366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piususing android::hardware::hidl_array; 218366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius 22fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusconstexpr uint8_t kWfdDeviceInfoLen = 8; 238366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius// GSM-AUTH:<RAND1>:<RAND2>[:<RAND3>] 248366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piusconstexpr char kGsmAuthRegex2[] = "GSM-AUTH:([0-9a-f]+):([0-9a-f]+)"; 258366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piusconstexpr char kGsmAuthRegex3[] = 268366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius "GSM-AUTH:([0-9a-f]+):([0-9a-f]+):([0-9a-f]+)"; 278366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius// UMTS-AUTH:<RAND>:<AUTN> 288366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piusconstexpr char kUmtsAuthRegex[] = "UMTS-AUTH:([0-9a-f]+):([0-9a-f]+)"; 298366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piusconstexpr size_t kGsmRandLenBytes = GSM_RAND_LEN; 308366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piusconstexpr size_t kUmtsRandLenBytes = EAP_AKA_RAND_LEN; 318366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piusconstexpr size_t kUmtsAutnLenBytes = EAP_AKA_AUTN_LEN; 32fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 33ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius/** 34ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Check if the provided |wpa_supplicant| structure represents a P2P iface or 35ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * not. 36ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius */ 37ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusconstexpr bool isP2pIface(const struct wpa_supplicant *wpa_s) 38ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 39ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return (wpa_s->global->p2p_init_wpa_s == wpa_s); 40ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 41ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 42ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius/** 43ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Creates a unique key for the network using the provided |ifname| and 44ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * |network_id| to be used in the internal map of |ISupplicantNetwork| objects. 45ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * This is of the form |ifname|_|network_id|. For ex: "wlan0_1". 46ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 47ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param ifname Name of the corresponding interface. 48ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param network_id ID of the corresponding network. 49ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius */ 50ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusconst std::string getNetworkObjectMapKey( 51ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, int network_id) 52ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 53ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return ifname + "_" + std::to_string(network_id); 54ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 55ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 56ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius/** 57ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Add callback to the corresponding list after linking to death on the 58ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * corresponding hidl object reference. 59ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius */ 60ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class CallbackType> 61ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint registerForDeathAndAddCallbackHidlObjectToList( 62ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<CallbackType> &callback, 63ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function<void(const android::sp<CallbackType> &)> 64ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &on_hidl_died_fctor, 65ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::vector<android::sp<CallbackType>> &callback_list) 66ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 67ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius#if 0 // TODO(b/31632518): HIDL object death notifications. 68ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto death_notifier = new CallbackObjectDeathNotifier<CallbackType>( 69ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callback, on_hidl_died_fctor); 70ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Use the |callback.get()| as cookie so that we don't need to 71ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // store a reference to this |CallbackObjectDeathNotifier| instance 72ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // to use in |unlinkToDeath| later. 73ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // NOTE: This may cause an immediate callback if the object is already 74ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // dead, so add it to the list before we register for callback! 75ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (android::hardware::IInterface::asBinder(callback)->linkToDeath( 76ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius death_notifier, callback.get()) != android::OK) { 77ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius wpa_printf( 78ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius MSG_ERROR, 79ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius "Error registering for death notification for " 80ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius "supplicant callback object"); 81ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callback_list.erase( 82ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::remove( 83ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callback_list.begin(), callback_list.end(), callback), 84ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callback_list.end()); 85ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 86ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 87ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius#endif // TODO(b/31632518): HIDL object death notifications. 88ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callback_list.push_back(callback); 89ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 0; 90e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt} 91e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 92ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class ObjectType> 93ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint addHidlObjectToMap( 94ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &key, const android::sp<ObjectType> object, 95ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::map<const std::string, android::sp<ObjectType>> &object_map) 96ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 97ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Return failure if we already have an object for that |key|. 98ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (object_map.find(key) != object_map.end()) 99ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 100ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius object_map[key] = object; 101ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (!object_map[key].get()) 102ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 103ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 0; 104ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 105ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 106ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class ObjectType> 107ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint removeHidlObjectFromMap( 108ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &key, 109ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::map<const std::string, android::sp<ObjectType>> &object_map) 110ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 111ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Return failure if we dont have an object for that |key|. 11219f21dcdb1ecf8504efef43a384b1b81b9dee905Roshan Pius const auto &object_iter = object_map.find(key); 11319f21dcdb1ecf8504efef43a384b1b81b9dee905Roshan Pius if (object_iter == object_map.end()) 114ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 11519f21dcdb1ecf8504efef43a384b1b81b9dee905Roshan Pius object_iter->second->invalidate(); 11619f21dcdb1ecf8504efef43a384b1b81b9dee905Roshan Pius object_map.erase(object_iter); 117ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 0; 118ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 119ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 120ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class CallbackType> 121ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint addIfaceCallbackHidlObjectToMap( 122ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, const android::sp<CallbackType> &callback, 123ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function<void(const android::sp<CallbackType> &)> 124ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &on_hidl_died_fctor, 125ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::map<const std::string, std::vector<android::sp<CallbackType>>> 126ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &callbacks_map) 127ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 128ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (ifname.empty()) 129ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 130ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 131ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto iface_callback_map_iter = callbacks_map.find(ifname); 132ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (iface_callback_map_iter == callbacks_map.end()) 133ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 134ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto &iface_callback_list = iface_callback_map_iter->second; 135ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 136ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Register for death notification before we add it to our list. 137ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return registerForDeathAndAddCallbackHidlObjectToList<CallbackType>( 138ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callback, on_hidl_died_fctor, iface_callback_list); 139ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 140ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 141ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class CallbackType> 142ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint addNetworkCallbackHidlObjectToMap( 143ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, int network_id, 144ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<CallbackType> &callback, 145ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function<void(const android::sp<CallbackType> &)> 146ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &on_hidl_died_fctor, 147ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::map<const std::string, std::vector<android::sp<CallbackType>>> 148ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &callbacks_map) 149ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 150ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (ifname.empty() || network_id < 0) 151ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 152ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 153ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Generate the key to be used to lookup the network. 154ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string network_key = 155ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius getNetworkObjectMapKey(ifname, network_id); 156ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto network_callback_map_iter = callbacks_map.find(network_key); 157ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (network_callback_map_iter == callbacks_map.end()) 158ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 159ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto &network_callback_list = network_callback_map_iter->second; 160ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 161ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Register for death notification before we add it to our list. 162ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return registerForDeathAndAddCallbackHidlObjectToList<CallbackType>( 163ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callback, on_hidl_died_fctor, network_callback_list); 164ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 165ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 166ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class CallbackType> 167ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint removeAllIfaceCallbackHidlObjectsFromMap( 168ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, 169ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::map<const std::string, std::vector<android::sp<CallbackType>>> 170ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &callbacks_map) 171ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 172ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto iface_callback_map_iter = callbacks_map.find(ifname); 173ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (iface_callback_map_iter == callbacks_map.end()) 174ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 175ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius#if 0 // TODO(b/31632518): HIDL object death notifications. 176ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const auto &iface_callback_list = iface_callback_map_iter->second; 177ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius for (const auto &callback : iface_callback_list) { 178ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (android::hardware::IInterface::asBinder(callback) 179ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ->unlinkToDeath(nullptr, callback.get()) != 180ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius android::OK) { 181ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius wpa_printf( 182ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius MSG_ERROR, 183ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius "Error deregistering for death notification for " 184ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius "iface callback object"); 185ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 186ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 187ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius#endif // TODO(b/31632518): HIDL object death notifications. 188ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callbacks_map.erase(iface_callback_map_iter); 189ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 0; 190ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 191ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 192ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class CallbackType> 193ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint removeAllNetworkCallbackHidlObjectsFromMap( 194ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &network_key, 195ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::map<const std::string, std::vector<android::sp<CallbackType>>> 196ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &callbacks_map) 197ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 198ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto network_callback_map_iter = callbacks_map.find(network_key); 199ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (network_callback_map_iter == callbacks_map.end()) 200ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 201ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius#if 0 // TODO(b/31632518): HIDL object death notifications. 202ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const auto &network_callback_list = network_callback_map_iter->second; 203ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius for (const auto &callback : network_callback_list) { 204ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (android::hardware::IInterface::asBinder(callback) 205ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ->unlinkToDeath(nullptr, callback.get()) != 206ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius android::OK) { 207ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius wpa_printf( 208ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius MSG_ERROR, 209ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius "Error deregistering for death " 210ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius "notification for " 211ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius "network callback object"); 212ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 213ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 214ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius#endif // TODO(b/31632518): HIDL object death notifications. 215ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callbacks_map.erase(network_callback_map_iter); 216ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 0; 217ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 218ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 219ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class CallbackType> 220ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid removeIfaceCallbackHidlObjectFromMap( 221ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, const android::sp<CallbackType> &callback, 222ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::map<const std::string, std::vector<android::sp<CallbackType>>> 223ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &callbacks_map) 224ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 225ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (ifname.empty()) 226ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return; 227ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 228ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto iface_callback_map_iter = callbacks_map.find(ifname); 229ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (iface_callback_map_iter == callbacks_map.end()) 230ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return; 231ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 232ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto &iface_callback_list = iface_callback_map_iter->second; 233ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius iface_callback_list.erase( 234ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::remove( 235ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius iface_callback_list.begin(), iface_callback_list.end(), 236ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callback), 237ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius iface_callback_list.end()); 238ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 239ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 240ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class CallbackType> 241ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid removeNetworkCallbackHidlObjectFromMap( 242ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, int network_id, 243ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<CallbackType> &callback, 244ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::map<const std::string, std::vector<android::sp<CallbackType>>> 245ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &callbacks_map) 246ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 247ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (ifname.empty() || network_id < 0) 248ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return; 249ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 250ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Generate the key to be used to lookup the network. 251ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string network_key = 252ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius getNetworkObjectMapKey(ifname, network_id); 253ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 254ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto network_callback_map_iter = callbacks_map.find(network_key); 255ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (network_callback_map_iter == callbacks_map.end()) 256ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return; 257ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 258ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto &network_callback_list = network_callback_map_iter->second; 259ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius network_callback_list.erase( 260ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::remove( 261ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius network_callback_list.begin(), network_callback_list.end(), 262ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callback), 263ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius network_callback_list.end()); 264ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 265ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 266ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class CallbackType> 267ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid callWithEachIfaceCallback( 268ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, 269ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function< 270ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius android::hardware::Return<void>(android::sp<CallbackType>)> &method, 271ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::map<const std::string, std::vector<android::sp<CallbackType>>> 272ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &callbacks_map) 273ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 274ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (ifname.empty()) 275ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return; 276ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 277ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto iface_callback_map_iter = callbacks_map.find(ifname); 278ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (iface_callback_map_iter == callbacks_map.end()) 279ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return; 280ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const auto &iface_callback_list = iface_callback_map_iter->second; 281ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius for (const auto &callback : iface_callback_list) { 282cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius if (!method(callback).isOk()) { 283cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius wpa_printf( 284cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius MSG_ERROR, "Failed to invoke HIDL iface callback"); 285cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius } 286ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 287ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 288ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 289ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class CallbackType> 290ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid callWithEachNetworkCallback( 291ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, int network_id, 292ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function< 293ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius android::hardware::Return<void>(android::sp<CallbackType>)> &method, 294ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::map<const std::string, std::vector<android::sp<CallbackType>>> 295ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &callbacks_map) 296ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 297ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (ifname.empty() || network_id < 0) 298ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return; 299ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 300ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Generate the key to be used to lookup the network. 301ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string network_key = 302ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius getNetworkObjectMapKey(ifname, network_id); 303ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto network_callback_map_iter = callbacks_map.find(network_key); 304ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (network_callback_map_iter == callbacks_map.end()) 305ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return; 306ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const auto &network_callback_list = network_callback_map_iter->second; 307ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius for (const auto &callback : network_callback_list) { 308cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius if (!method(callback).isOk()) { 309cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius wpa_printf( 310cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius MSG_ERROR, 311cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius "Failed to invoke HIDL network callback"); 312cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius } 313ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 314ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 3159322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 3169322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Piusstd::vector<uint8_t> convertWpaBufToVector(const struct wpabuf *buf) 3179322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius{ 3189322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius if (buf) { 3199322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius return std::vector<uint8_t>( 3209322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius wpabuf_head_u8(buf), wpabuf_head_u8(buf) + wpabuf_len(buf)); 3219322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius } else { 3229322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius return std::vector<uint8_t>(); 3239322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius } 3249322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius} 3258366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius 3268366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piusint parseGsmAuthNetworkRequest( 3278366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius const std::string ¶ms_str, 3288366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::vector<hidl_array<uint8_t, kGsmRandLenBytes>> *out_rands) 3298366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius{ 3308366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::smatch matches; 3318366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::regex params_gsm_regex2(kGsmAuthRegex2); 3328366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::regex params_gsm_regex3(kGsmAuthRegex3); 3338366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius if (!std::regex_match(params_str, matches, params_gsm_regex3) && 3348366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius !std::regex_match(params_str, matches, params_gsm_regex2)) { 3358366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 1; 3368366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 3378366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius for (uint32_t i = 1; i < matches.size(); i++) { 3388366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius hidl_array<uint8_t, kGsmRandLenBytes> rand; 3398366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius const auto &match = matches[i]; 3408366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius WPA_ASSERT(match.size() >= 2 * rand.size()); 3418366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius if (hexstr2bin(match.str().c_str(), rand.data(), rand.size())) { 3428366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius wpa_printf( 3438366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius MSG_ERROR, "Failed to parse GSM auth params"); 3448366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 1; 3458366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 3468366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius out_rands->push_back(rand); 3478366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 3488366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 0; 3498366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius} 3508366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius 3518366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piusint parseUmtsAuthNetworkRequest( 3528366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius const std::string ¶ms_str, 3538366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius hidl_array<uint8_t, kUmtsRandLenBytes> *out_rand, 3548366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius hidl_array<uint8_t, kUmtsAutnLenBytes> *out_autn) 3558366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius{ 3568366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::smatch matches; 3578366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::regex params_umts_regex(kUmtsAuthRegex); 3588366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius if (!std::regex_match(params_str, matches, params_umts_regex)) { 3598366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 1; 3608366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 3618366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius WPA_ASSERT(matches[1].size() >= 2 * out_rand->size()); 3628366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius if (hexstr2bin( 3638366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius matches[1].str().c_str(), out_rand->data(), out_rand->size())) { 3648366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius wpa_printf(MSG_ERROR, "Failed to parse UMTS auth params"); 3658366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 1; 3668366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 3678366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius WPA_ASSERT(matches[2].size() >= 2 * out_autn->size()); 3688366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius if (hexstr2bin( 3698366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius matches[2].str().c_str(), out_autn->data(), out_autn->size())) { 3708366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius wpa_printf(MSG_ERROR, "Failed to parse UMTS auth params"); 3718366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 1; 3728366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 3738366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 0; 3748366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius} 375ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} // namespace 376ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 3777c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace android { 3787c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace hardware { 3797c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace wifi { 3807c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace supplicant { 3817c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace V1_0 { 3827c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace implementation { 383e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 38457ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan PiusHidlManager *HidlManager::instance_ = NULL; 385e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 38657ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan PiusHidlManager *HidlManager::getInstance() 387e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt{ 388e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt if (!instance_) 38957ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius instance_ = new HidlManager(); 390e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return instance_; 391e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt} 392e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 39357ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusvoid HidlManager::destroyInstance() 394e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt{ 395e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt if (instance_) 396e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt delete instance_; 397e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt instance_ = NULL; 398e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt} 399e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 40057ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusint HidlManager::registerHidlService(struct wpa_global *global) 401e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt{ 4027c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius // Create the main hidl service object and register it. 403e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt supplicant_object_ = new Supplicant(global); 40494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius if (supplicant_object_->registerAsService() != android::NO_ERROR) { 4057c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius return 1; 4067c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius } 407e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return 0; 408e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt} 409e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 41032c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius/** 41157ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * Register an interface to hidl manager. 41232c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * 41332c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface. 41432c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * 41532c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * @return 0 on success, 1 on failure. 41632c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius */ 41757ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusint HidlManager::registerInterface(struct wpa_supplicant *wpa_s) 418e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt{ 419e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt if (!wpa_s) 420e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return 1; 421e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 422ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (isP2pIface(wpa_s)) { 423ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (addHidlObjectToMap<P2pIface>( 424fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 425fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius new P2pIface(wpa_s->global, wpa_s->ifname), 426ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius p2p_iface_object_map_)) 427ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 428fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_callbacks_map_[wpa_s->ifname] = 429ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::vector<android::sp<ISupplicantP2pIfaceCallback>>(); 430ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } else { 431ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (addHidlObjectToMap<StaIface>( 432fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 433fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius new StaIface(wpa_s->global, wpa_s->ifname), 434ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius sta_iface_object_map_)) 435ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 436fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_callbacks_map_[wpa_s->ifname] = 437ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::vector<android::sp<ISupplicantStaIfaceCallback>>(); 438ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 4392d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius 4407c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius // Invoke the |onInterfaceCreated| method on all registered callbacks. 4412d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius callWithEachSupplicantCallback(std::bind( 4427c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius &ISupplicantCallback::onInterfaceCreated, std::placeholders::_1, 443fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname)); 444e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return 0; 445e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt} 446e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 44732c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius/** 44857ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * Unregister an interface from hidl manager. 44932c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * 45032c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface. 45132c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * 45232c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * @return 0 on success, 1 on failure. 45332c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius */ 45457ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusint HidlManager::unregisterInterface(struct wpa_supplicant *wpa_s) 455e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt{ 45632c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius if (!wpa_s) 457e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return 1; 458e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 459ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (isP2pIface(wpa_s)) { 460fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (removeHidlObjectFromMap( 461fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, p2p_iface_object_map_)) 462ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 463ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (removeAllIfaceCallbackHidlObjectsFromMap( 464fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, p2p_iface_callbacks_map_)) { 465ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 466ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 467ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } else { 468fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (removeHidlObjectFromMap( 469fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, sta_iface_object_map_)) 470ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 471ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (removeAllIfaceCallbackHidlObjectsFromMap( 472fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, sta_iface_callbacks_map_)) { 473ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 4748e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius } 4758e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius } 4762d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius 4777c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius // Invoke the |onInterfaceRemoved| method on all registered callbacks. 4782d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius callWithEachSupplicantCallback(std::bind( 4797c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius &ISupplicantCallback::onInterfaceRemoved, std::placeholders::_1, 480fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname)); 481e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return 0; 482e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt} 483e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 48432c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius/** 48557ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * Register a network to hidl manager. 486d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * 487d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface on which 488d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * the network is added. 489d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @param ssid |wpa_ssid| struct corresponding to the network being added. 490d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * 491d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @return 0 on success, 1 on failure. 492d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius */ 49357ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusint HidlManager::registerNetwork( 494d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid) 495d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius{ 496d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius if (!wpa_s || !ssid) 497d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius return 1; 498d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 499d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius // Generate the key to be used to lookup the network. 500d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius const std::string network_key = 501d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius getNetworkObjectMapKey(wpa_s->ifname, ssid->id); 502d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 503ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (isP2pIface(wpa_s)) { 504ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (addHidlObjectToMap<P2pNetwork>( 505ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius network_key, 506ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius new P2pNetwork(wpa_s->global, wpa_s->ifname, ssid->id), 507ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius p2p_network_object_map_)) 508ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 509ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius p2p_network_callbacks_map_[network_key] = 510ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::vector<android::sp<ISupplicantP2pNetworkCallback>>(); 511ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Invoke the |onNetworkAdded| method on all registered 512ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // callbacks. 513ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callWithEachP2pIfaceCallback( 514ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius wpa_s->ifname, 515ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::bind( 516ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &ISupplicantP2pIfaceCallback::onNetworkAdded, 517ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::placeholders::_1, ssid->id)); 518ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } else { 519ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (addHidlObjectToMap<StaNetwork>( 520ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius network_key, 521ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius new StaNetwork(wpa_s->global, wpa_s->ifname, ssid->id), 522ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius sta_network_object_map_)) 523ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 524ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius sta_network_callbacks_map_[network_key] = 525ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::vector<android::sp<ISupplicantStaNetworkCallback>>(); 526ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Invoke the |onNetworkAdded| method on all registered 527ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // callbacks. 528ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callWithEachStaIfaceCallback( 529ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius wpa_s->ifname, 530ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::bind( 531ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &ISupplicantStaIfaceCallback::onNetworkAdded, 532ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::placeholders::_1, ssid->id)); 533ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 534d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius return 0; 535d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius} 536d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 537d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius/** 53857ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * Unregister a network from hidl manager. 539d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * 540d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface on which 541d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * the network is added. 542d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @param ssid |wpa_ssid| struct corresponding to the network being added. 543d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * 544d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @return 0 on success, 1 on failure. 545d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius */ 54657ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusint HidlManager::unregisterNetwork( 547d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid) 548d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius{ 549d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius if (!wpa_s || !ssid) 550d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius return 1; 551d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 552d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius // Generate the key to be used to lookup the network. 553d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius const std::string network_key = 554d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius getNetworkObjectMapKey(wpa_s->ifname, ssid->id); 555d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 556ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (isP2pIface(wpa_s)) { 557ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (removeHidlObjectFromMap(network_key, p2p_iface_object_map_)) 558ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 559ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (removeAllNetworkCallbackHidlObjectsFromMap( 560ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius network_key, p2p_network_callbacks_map_)) 561ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 562ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 563ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Invoke the |onNetworkRemoved| method on all registered 564ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // callbacks. 565ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callWithEachP2pIfaceCallback( 566ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius wpa_s->ifname, 567ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::bind( 568ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &ISupplicantP2pIfaceCallback::onNetworkRemoved, 569ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::placeholders::_1, ssid->id)); 570ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } else { 571ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (removeHidlObjectFromMap(network_key, sta_iface_object_map_)) 572ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 573ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (removeAllNetworkCallbackHidlObjectsFromMap( 574ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius network_key, sta_network_callbacks_map_)) 575ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 576ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 577ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Invoke the |onNetworkRemoved| method on all registered 578ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // callbacks. 579ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callWithEachStaIfaceCallback( 580ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius wpa_s->ifname, 581ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::bind( 582ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &ISupplicantStaIfaceCallback::onNetworkRemoved, 583ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::placeholders::_1, ssid->id)); 5848e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius } 585e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius return 0; 586e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius} 587e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius 588e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius/** 589e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius * Notify all listeners about any state changes on a particular interface. 590e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius * 591e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface on which 592e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius * the state change event occured. 593e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius */ 59457ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusint HidlManager::notifyStateChange(struct wpa_supplicant *wpa_s) 595e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius{ 596e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius if (!wpa_s) 597e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius return 1; 598e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius 599fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 600fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 601e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius return 1; 602e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius 6037c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius // Invoke the |onStateChanged| method on all registered callbacks. 6047c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius uint32_t hidl_network_id = UINT32_MAX; 6057c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius std::vector<uint8_t> hidl_ssid; 606e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius if (wpa_s->current_ssid) { 6077c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius hidl_network_id = wpa_s->current_ssid->id; 6087c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius hidl_ssid.assign( 609e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius wpa_s->current_ssid->ssid, 610e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius wpa_s->current_ssid->ssid + wpa_s->current_ssid->ssid_len); 611e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius } 612ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callWithEachStaIfaceCallback( 6137c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius wpa_s->ifname, std::bind( 614ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &ISupplicantStaIfaceCallback::onStateChanged, 615fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, 616fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius static_cast<ISupplicantStaIfaceCallback::State>( 617fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->wpa_state), 618fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->bssid, hidl_network_id, hidl_ssid)); 619d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius return 0; 620d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius} 621d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 622d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius/** 62365628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius * Notify all listeners about a request on a particular network. 62465628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius * 62565628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface on which 62665628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius * the network is present. 62765628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius * @param ssid |wpa_ssid| struct corresponding to the network. 62865628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius * @param type type of request. 62965628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius * @param param addition params associated with the request. 63065628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius */ 63157ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusint HidlManager::notifyNetworkRequest( 63265628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid, int type, 63365628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius const char *param) 63465628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius{ 63565628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius if (!wpa_s || !ssid) 63665628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius return 1; 63765628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius 63865628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius const std::string network_key = 63965628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius getNetworkObjectMapKey(wpa_s->ifname, ssid->id); 640ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (sta_network_object_map_.find(network_key) == 641ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius sta_network_object_map_.end()) 64265628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius return 1; 64365628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius 6448366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius if (type == WPA_CTRL_REQ_EAP_IDENTITY) { 6458366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius callWithEachStaNetworkCallback( 6468366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius wpa_s->ifname, ssid->id, 6478366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::bind( 6488366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius &ISupplicantStaNetworkCallback:: 6498366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius onNetworkEapIdentityRequest, 6508366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::placeholders::_1)); 6518366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 0; 6528366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 6538366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius if (type == WPA_CTRL_REQ_SIM) { 6548366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::vector<hidl_array<uint8_t, 16>> gsm_rands; 6558366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius hidl_array<uint8_t, 16> umts_rand; 6568366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius hidl_array<uint8_t, 16> umts_autn; 6578366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius if (!parseGsmAuthNetworkRequest(param, &gsm_rands)) { 6588366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius ISupplicantStaNetworkCallback:: 6598366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius NetworkRequestEapSimGsmAuthParams hidl_params; 6608366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius hidl_params.rands = gsm_rands; 6618366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius callWithEachStaNetworkCallback( 6628366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius wpa_s->ifname, ssid->id, 6638366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::bind( 6648366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius &ISupplicantStaNetworkCallback:: 6658366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius onNetworkEapSimGsmAuthRequest, 6668366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::placeholders::_1, hidl_params)); 6678366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 0; 6688366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 6698366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius if (!parseUmtsAuthNetworkRequest( 6708366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius param, &umts_rand, &umts_autn)) { 6718366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius ISupplicantStaNetworkCallback:: 6728366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius NetworkRequestEapSimUmtsAuthParams hidl_params; 6738366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius hidl_params.rand = umts_rand; 6748366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius hidl_params.autn = umts_autn; 6758366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius callWithEachStaNetworkCallback( 6768366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius wpa_s->ifname, ssid->id, 6778366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::bind( 6788366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius &ISupplicantStaNetworkCallback:: 6798366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius onNetworkEapSimUmtsAuthRequest, 6808366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::placeholders::_1, hidl_params)); 6818366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 0; 6828366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 6838366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 6848366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 1; 68565628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius} 68665628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius 68765628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius/** 6889322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * Notify all listeners about the end of an ANQP query. 6899322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * 6909322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface. 6919322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param bssid BSSID of the access point. 6929322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param result Result of the operation ("SUCCESS" or "FAILURE"). 6939322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param anqp |wpa_bss_anqp| ANQP data fetched. 6949322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius */ 6959322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Piusvoid HidlManager::notifyAnqpQueryDone( 6969322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius struct wpa_supplicant *wpa_s, const u8 *bssid, const char *result, 6979322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius const struct wpa_bss_anqp *anqp) 6989322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius{ 6999322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius if (!wpa_s || !bssid || !result || !anqp) 7009322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius return; 7019322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 702fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 703fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 7049322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius return; 7059322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 7069322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius ISupplicantStaIfaceCallback::AnqpData hidl_anqp_data; 7079322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius ISupplicantStaIfaceCallback::Hs20AnqpData hidl_hs20_anqp_data; 7089322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius if (std::string(result) == "SUCCESS") { 7099322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_anqp_data.venueName = 7109322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius convertWpaBufToVector(anqp->venue_name); 7119322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_anqp_data.roamingConsortium = 7129322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius convertWpaBufToVector(anqp->roaming_consortium); 7139322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_anqp_data.ipAddrTypeAvailability = 7149322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius convertWpaBufToVector(anqp->ip_addr_type_availability); 7159322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_anqp_data.naiRealm = 7169322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius convertWpaBufToVector(anqp->nai_realm); 7179322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_anqp_data.anqp3gppCellularNetwork = 7189322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius convertWpaBufToVector(anqp->anqp_3gpp); 7199322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_anqp_data.domainName = 7209322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius convertWpaBufToVector(anqp->domain_name); 7219322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 7229322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_hs20_anqp_data.operatorFriendlyName = 7239322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius convertWpaBufToVector(anqp->hs20_operator_friendly_name); 7249322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_hs20_anqp_data.wanMetrics = 7259322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius convertWpaBufToVector(anqp->hs20_wan_metrics); 7269322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_hs20_anqp_data.connectionCapability = 7279322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius convertWpaBufToVector(anqp->hs20_connection_capability); 7289322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_hs20_anqp_data.osuProvidersList = 7299322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius convertWpaBufToVector(anqp->hs20_osu_providers_list); 7309322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius } 7319322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 7329322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius callWithEachStaIfaceCallback( 7339322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius wpa_s->ifname, std::bind( 7349322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius &ISupplicantStaIfaceCallback::onAnqpQueryDone, 735fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, bssid, hidl_anqp_data, 736fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius hidl_hs20_anqp_data)); 7379322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius} 7389322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 7399322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius/** 7409322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * Notify all listeners about the end of an HS20 icon query. 7419322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * 7429322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface. 7439322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param bssid BSSID of the access point. 7449322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param file_name Name of the icon file. 7459322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param image Raw bytes of the icon file. 7469322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param image_length Size of the the icon file. 7479322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius */ 7489322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Piusvoid HidlManager::notifyHs20IconQueryDone( 7499322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius struct wpa_supplicant *wpa_s, const u8 *bssid, const char *file_name, 7509322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius const u8 *image, u32 image_length) 7519322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius{ 7529322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius if (!wpa_s || !bssid || !file_name || !image) 7539322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius return; 7549322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 755fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 756fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 7579322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius return; 7589322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 7599322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius callWithEachStaIfaceCallback( 7609322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius wpa_s->ifname, 7619322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius std::bind( 7629322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius &ISupplicantStaIfaceCallback::onHs20IconQueryDone, 763fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, bssid, file_name, 764fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::vector<uint8_t>(image, image + image_length))); 7659322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius} 7669322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 7679322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius/** 7689322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * Notify all listeners about the reception of HS20 subscription 7699322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * remediation notification from the server. 7709322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * 7719322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface. 7729322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param url URL of the server. 7739322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param osu_method OSU method (OMA_DM or SOAP_XML_SPP). 7749322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius */ 7759322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Piusvoid HidlManager::notifyHs20RxSubscriptionRemediation( 7769322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius struct wpa_supplicant *wpa_s, const char *url, u8 osu_method) 7779322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius{ 7789322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius if (!wpa_s || !url) 7799322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius return; 7809322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 781fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 782fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 7839322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius return; 7849322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 7859322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius ISupplicantStaIfaceCallback::OsuMethod hidl_osu_method = {}; 7869322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius if (osu_method & 0x1) { 7879322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_osu_method = 7889322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius ISupplicantStaIfaceCallback::OsuMethod::OMA_DM; 7899322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius } else if (osu_method & 0x2) { 7909322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_osu_method = 7919322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius ISupplicantStaIfaceCallback::OsuMethod::SOAP_XML_SPP; 7929322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius } 7939322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius callWithEachStaIfaceCallback( 7949322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius wpa_s->ifname, 7959322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius std::bind( 7969322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius &ISupplicantStaIfaceCallback::onHs20SubscriptionRemediation, 7979322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius std::placeholders::_1, hidl_osu_method, url)); 7989322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius} 7999322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 8009322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius/** 8019322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * Notify all listeners about the reception of HS20 immient deauth 8029322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * notification from the server. 8039322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * 8049322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface. 8059322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param code Deauth reason code sent from server. 8069322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param reauth_delay Reauthentication delay in seconds sent from server. 8079322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param url URL of the server. 8089322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius */ 8099322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Piusvoid HidlManager::notifyHs20RxDeauthImminentNotice( 8109322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius struct wpa_supplicant *wpa_s, u8 code, u16 reauth_delay, const char *url) 8119322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius{ 8129322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius if (!wpa_s || !url) 8139322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius return; 8149322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 815fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 816fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 8179322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius return; 8189322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 8199322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius callWithEachStaIfaceCallback( 8209322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius wpa_s->ifname, 8219322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius std::bind( 8229322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius &ISupplicantStaIfaceCallback::onHs20DeauthImminentNotice, 8239322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius std::placeholders::_1, code, reauth_delay, url)); 8249322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius} 8259322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 8269322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius/** 8270974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * Notify all listeners about the reason code for disconnection from the 8280974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * currently connected network. 8290974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * 8300974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface on which 8310974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * the network is present. 8320974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius */ 8330974e961cd7bac71cf4d5919551e84541abf2b38Roshan Piusvoid HidlManager::notifyDisconnectReason(struct wpa_supplicant *wpa_s) 8340974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius{ 8350974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius if (!wpa_s) 8360974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius return; 8370974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius 838fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 839fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 8400974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius return; 8410974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius 8420974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius const u8 *bssid = wpa_s->bssid; 8430974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius if (is_zero_ether_addr(bssid)) { 8440974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius bssid = wpa_s->pending_bssid; 8450974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius } 8460974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius 8470974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius callWithEachStaIfaceCallback( 8480974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius wpa_s->ifname, 8490974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius std::bind( 8500974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius &ISupplicantStaIfaceCallback::onDisconnected, 851fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, bssid, wpa_s->disconnect_reason < 0, 8520974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius wpa_s->disconnect_reason)); 8530974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius} 8540974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius 8550974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius/** 8560974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * Notify all listeners about association reject from the access point to which 8570974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * we are attempting to connect. 8580974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * 8590974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface on which 8600974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * the network is present. 8610974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius */ 8620974e961cd7bac71cf4d5919551e84541abf2b38Roshan Piusvoid HidlManager::notifyAssocReject(struct wpa_supplicant *wpa_s) 8630974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius{ 8640974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius if (!wpa_s) 8650974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius return; 8660974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius 867fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 868fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 8690974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius return; 8700974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius 8710974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius const u8 *bssid = wpa_s->bssid; 8720974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius if (is_zero_ether_addr(bssid)) { 8730974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius bssid = wpa_s->pending_bssid; 8740974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius } 8750974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius 8760974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius callWithEachStaIfaceCallback( 8770974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius wpa_s->ifname, 8780974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius std::bind( 8790974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius &ISupplicantStaIfaceCallback::onAssociationRejected, 880fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, bssid, wpa_s->assoc_status_code)); 8810974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius} 8820974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius 88338e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Piusvoid HidlManager::notifyAuthTimeout(struct wpa_supplicant *wpa_s) 88438e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius{ 88538e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius if (!wpa_s) 88638e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius return; 88738e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius 88838e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius const std::string ifname(wpa_s->ifname); 88938e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius if (sta_iface_object_map_.find(ifname) == sta_iface_object_map_.end()) 89038e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius return; 89138e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius 89238e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius const u8 *bssid = wpa_s->bssid; 89338e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius if (is_zero_ether_addr(bssid)) { 89438e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius bssid = wpa_s->pending_bssid; 89538e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius } 89638e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius std::array<uint8_t, ETH_ALEN> hidl_bssid; 89738e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius os_memcpy(hidl_bssid.data(), bssid, ETH_ALEN); 89838e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius 89938e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius callWithEachStaIfaceCallback( 90038e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius wpa_s->ifname, 90138e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius std::bind( 90238e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius &ISupplicantStaIfaceCallback::onAuthenticationTimeout, 90338e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius std::placeholders::_1, hidl_bssid)); 90438e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius} 90538e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius 906149327590e009d96301e69772e717e227215d5acRoshan Piusvoid HidlManager::notifyWpsEventFail( 907149327590e009d96301e69772e717e227215d5acRoshan Pius struct wpa_supplicant *wpa_s, uint8_t *peer_macaddr, uint16_t config_error, 908149327590e009d96301e69772e717e227215d5acRoshan Pius uint16_t error_indication) 909149327590e009d96301e69772e717e227215d5acRoshan Pius{ 910149327590e009d96301e69772e717e227215d5acRoshan Pius if (!wpa_s || !peer_macaddr) 911149327590e009d96301e69772e717e227215d5acRoshan Pius return; 912149327590e009d96301e69772e717e227215d5acRoshan Pius 913fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 914fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 915149327590e009d96301e69772e717e227215d5acRoshan Pius return; 916149327590e009d96301e69772e717e227215d5acRoshan Pius 917149327590e009d96301e69772e717e227215d5acRoshan Pius callWithEachStaIfaceCallback( 918fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 919fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 920fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantStaIfaceCallback::onWpsEventFail, 921fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, peer_macaddr, 922fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius static_cast<ISupplicantStaIfaceCallback::WpsConfigError>( 923fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius config_error), 924fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius static_cast<ISupplicantStaIfaceCallback::WpsErrorIndication>( 925fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius error_indication))); 926149327590e009d96301e69772e717e227215d5acRoshan Pius} 927149327590e009d96301e69772e717e227215d5acRoshan Pius 928149327590e009d96301e69772e717e227215d5acRoshan Piusvoid HidlManager::notifyWpsEventSuccess(struct wpa_supplicant *wpa_s) 929149327590e009d96301e69772e717e227215d5acRoshan Pius{ 930149327590e009d96301e69772e717e227215d5acRoshan Pius if (!wpa_s) 931149327590e009d96301e69772e717e227215d5acRoshan Pius return; 932149327590e009d96301e69772e717e227215d5acRoshan Pius 933fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 934fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 935149327590e009d96301e69772e717e227215d5acRoshan Pius return; 936149327590e009d96301e69772e717e227215d5acRoshan Pius 937149327590e009d96301e69772e717e227215d5acRoshan Pius callWithEachStaIfaceCallback( 938149327590e009d96301e69772e717e227215d5acRoshan Pius wpa_s->ifname, std::bind( 939149327590e009d96301e69772e717e227215d5acRoshan Pius &ISupplicantStaIfaceCallback::onWpsEventSuccess, 940149327590e009d96301e69772e717e227215d5acRoshan Pius std::placeholders::_1)); 941149327590e009d96301e69772e717e227215d5acRoshan Pius} 942149327590e009d96301e69772e717e227215d5acRoshan Pius 943149327590e009d96301e69772e717e227215d5acRoshan Piusvoid HidlManager::notifyWpsEventPbcOverlap(struct wpa_supplicant *wpa_s) 944149327590e009d96301e69772e717e227215d5acRoshan Pius{ 945149327590e009d96301e69772e717e227215d5acRoshan Pius if (!wpa_s) 946149327590e009d96301e69772e717e227215d5acRoshan Pius return; 947149327590e009d96301e69772e717e227215d5acRoshan Pius 948fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 949fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 950149327590e009d96301e69772e717e227215d5acRoshan Pius return; 951149327590e009d96301e69772e717e227215d5acRoshan Pius 952149327590e009d96301e69772e717e227215d5acRoshan Pius callWithEachStaIfaceCallback( 9536a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius wpa_s->ifname, 9546a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius std::bind( 9556a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius &ISupplicantStaIfaceCallback::onWpsEventPbcOverlap, 9566a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius std::placeholders::_1)); 957149327590e009d96301e69772e717e227215d5acRoshan Pius} 958149327590e009d96301e69772e717e227215d5acRoshan Pius 959fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pDeviceFound( 960fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const u8 *addr, 961fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius const struct p2p_peer_info *info, const u8 *peer_wfd_device_info, 962fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius u8 peer_wfd_device_info_len) 963fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 964fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !addr || !info || !peer_wfd_device_info) 965fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 966fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 967fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 968fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 969fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 970fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 971fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (peer_wfd_device_info_len != kWfdDeviceInfoLen) { 972fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_printf( 973fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius MSG_ERROR, "Unexpected WFD device info len: %d", 974fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius peer_wfd_device_info_len); 975fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius } 976fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 977fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 978fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 979fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 980fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onDeviceFound, 981fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, addr, info->p2p_device_addr, 982fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius info->pri_dev_type, info->device_name, info->config_methods, 983fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius info->dev_capab, info->group_capab, peer_wfd_device_info)); 984fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 985fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 986fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pDeviceLost( 987fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const u8 *p2p_device_addr) 988fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 989fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !p2p_device_addr) 990fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 991fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 992fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 993fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 994fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 995fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 996fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 997fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, std::bind( 998fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onDeviceLost, 999fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, p2p_device_addr)); 1000fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1001fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1002fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pFindStopped(struct wpa_supplicant *wpa_s) 1003fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1004fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s) 1005fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1006fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1007fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1008fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1009fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1010fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1011fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1012fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, std::bind( 1013fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onFindStopped, 1014fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1)); 1015fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1016fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1017fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pGoNegReq( 1018fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const u8 *src_addr, u16 dev_passwd_id, 1019fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius u8 /* go_intent */) 1020fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1021fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !src_addr) 1022fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1023fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1024fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1025fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1026fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1027fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1028fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1029fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1030fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1031fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onGoNegotiationRequest, 1032fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, src_addr, 1033fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius static_cast<ISupplicantP2pIfaceCallback::WpsDevPasswordId>( 1034fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius dev_passwd_id))); 1035fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1036fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1037fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pGoNegCompleted( 1038fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const struct p2p_go_neg_results *res) 1039fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1040fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !res) 1041fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1042fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1043fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1044fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1045fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1046fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1047fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1048fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1049fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1050fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onGoNegotiationCompleted, 1051fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, 1052fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius static_cast<ISupplicantP2pIfaceCallback::P2pStatusCode>( 1053fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius res->status))); 1054fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1055fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1056fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pGroupFormationFailure( 1057fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const char *reason) 1058fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1059fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !reason) 1060fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1061fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1062fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1063fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1064fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1065fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1066fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1067fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1068fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1069fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onGroupFormationFailure, 1070fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, reason)); 1071fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1072fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1073fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pGroupStarted( 1074fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_group_s, const struct wpa_ssid *ssid, 1075fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius int persistent, int client, const u8 *ip) 1076fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1077fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_group_s || !wpa_group_s->parent || !ssid || !ip) 1078fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1079fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1080fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius // For group notifications, need to use the parent iface for callbacks. 1081fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s = wpa_group_s->parent; 1082fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1083fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1084fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1085fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1086fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius uint32_t hidl_freq = wpa_group_s->current_bss 1087fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius ? wpa_group_s->current_bss->freq 1088fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius : wpa_group_s->assoc_freq; 1089fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::array<uint8_t, 32> hidl_psk; 1090fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (ssid->psk_set) { 1091fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius os_memcpy(hidl_psk.data(), ssid->psk, 32); 1092fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius } 1093fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius bool hidl_is_go = (client == 0 ? true : false); 1094fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius bool hidl_is_persistent = (persistent == 1 ? true : false); 1095fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1096fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1097fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1098fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1099fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onGroupStarted, 1100fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, wpa_group_s->ifname, hidl_is_go, 1101fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::vector<uint8_t>{ssid->ssid, ssid->ssid + ssid->ssid_len}, 1102fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius hidl_freq, hidl_psk, ssid->passphrase, wpa_group_s->go_dev_addr, 1103fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius hidl_is_persistent)); 1104fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1105fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1106fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pGroupRemoved( 1107fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_group_s, const struct wpa_ssid *ssid, 1108fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius const char *role) 1109fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1110fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_group_s || !wpa_group_s->parent || !ssid || !role) 1111fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1112fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1113fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius // For group notifications, need to use the parent iface for callbacks. 1114fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s = wpa_group_s->parent; 1115fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1116fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1117fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1118fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1119fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius bool hidl_is_go = (std::string(role) == "GO"); 1120fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1121fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1122fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1123fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1124fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onGroupRemoved, 1125fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, wpa_group_s->ifname, hidl_is_go)); 1126fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1127fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1128fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pInvitationReceived( 1129fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const u8 *sa, const u8 *go_dev_addr, 1130fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius const u8 *bssid, int id, int op_freq) 1131fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1132fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !sa || !go_dev_addr || !bssid) 1133fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1134fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1135fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1136fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1137fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1138fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1139fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius SupplicantNetworkId hidl_network_id; 1140fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (id < 0) { 1141fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius hidl_network_id = UINT32_MAX; 1142fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius } 1143fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius hidl_network_id = id; 1144fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1145fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1146fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1147fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1148fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onInvitationReceived, 1149fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, sa, go_dev_addr, bssid, hidl_network_id, 1150fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius op_freq)); 1151fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1152fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1153fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pInvitationResult( 1154fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, int status, const u8 *bssid) 1155fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1156fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !bssid) 1157fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1158fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1159fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1160fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1161fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1162fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1163fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1164fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1165fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1166fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onInvitationResult, 1167fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, bssid, 1168fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius static_cast<ISupplicantP2pIfaceCallback::P2pStatusCode>( 1169fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius status))); 1170fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1171fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1172fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pProvisionDiscovery( 1173fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const u8 *dev_addr, int request, 1174fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius enum p2p_prov_disc_status status, u16 config_methods, 1175fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius unsigned int generated_pin) 1176fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1177fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !dev_addr) 1178fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1179fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1180fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1181fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1182fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1183fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1184fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::string hidl_generated_pin; 1185fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (generated_pin > 0) { 1186fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius hidl_generated_pin.reserve(9); 1187fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius os_snprintf( 1188fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &hidl_generated_pin[0], hidl_generated_pin.size(), "%08d", 1189fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius generated_pin); 1190fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius } 1191fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius bool hidl_is_request = (request == 1 ? true : false); 1192fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1193fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1194fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1195fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1196fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onProvisionDiscoveryCompleted, 1197fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, dev_addr, hidl_is_request, 1198fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius static_cast<ISupplicantP2pIfaceCallback::P2pProvDiscStatusCode>( 1199fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius status), 1200fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius config_methods, hidl_generated_pin)); 1201fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1202fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1203fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pSdResponse( 1204fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const u8 *sa, u16 update_indic, 1205fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius const u8 *tlvs, size_t tlvs_len) 1206fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1207fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !sa || !tlvs) 1208fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1209fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1210fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1211fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1212fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1213fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1214fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1215fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1216fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1217fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onServiceDiscoveryResponse, 1218fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, sa, update_indic, 1219fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::vector<uint8_t>{tlvs, tlvs + tlvs_len})); 1220fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1221fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1222fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyApStaAuthorized( 1223fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const u8 *sta, const u8 *p2p_dev_addr) 1224fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1225fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !sta || !p2p_dev_addr) 1226fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1227fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1228fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1229fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1230fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1231fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1232fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1233fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, std::bind( 1234fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onStaAuthorized, 1235fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, sta, p2p_dev_addr)); 1236fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1237fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1238fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyApStaDeauthorized( 1239fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const u8 *sta, const u8 *p2p_dev_addr) 1240fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1241fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !sta || !p2p_dev_addr) 1242fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1243fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1244fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1245fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1246fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1247fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1248fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1249fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, std::bind( 1250fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onStaDeauthorized, 1251fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, sta, p2p_dev_addr)); 1252fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1253fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 125494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piusvoid HidlManager::notifyExtRadioWorkStart( 125594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius struct wpa_supplicant *wpa_s, uint32_t id) 125694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{ 125794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius if (!wpa_s) 125894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius return; 125994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 1260fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 1261fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 126294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius return; 126394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 126494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius callWithEachStaIfaceCallback( 126594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius wpa_s->ifname, 126694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius std::bind( 126794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius &ISupplicantStaIfaceCallback::onExtRadioWorkStart, 126894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius std::placeholders::_1, id)); 126994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius} 127094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 127194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piusvoid HidlManager::notifyExtRadioWorkTimeout( 127294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius struct wpa_supplicant *wpa_s, uint32_t id) 127394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{ 127494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius if (!wpa_s) 127594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius return; 127694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 1277fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 1278fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 127994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius return; 128094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 128194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius callWithEachStaIfaceCallback( 128294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius wpa_s->ifname, 128394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius std::bind( 128494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius &ISupplicantStaIfaceCallback::onExtRadioWorkTimeout, 128594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius std::placeholders::_1, id)); 128694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius} 128794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 12880974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius/** 1289ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Retrieve the |ISupplicantP2pIface| hidl object reference using the provided 1290ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * ifname. 1291ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1292ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param ifname Name of the corresponding interface. 1293ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param iface_object Hidl reference corresponding to the iface. 1294ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1295ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @return 0 on success, 1 on failure. 1296ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius */ 1297ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint HidlManager::getP2pIfaceHidlObjectByIfname( 1298ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, android::sp<ISupplicantP2pIface> *iface_object) 1299ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 1300ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (ifname.empty() || !iface_object) 1301ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 1302ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 1303ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto iface_object_iter = p2p_iface_object_map_.find(ifname); 1304ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (iface_object_iter == p2p_iface_object_map_.end()) 1305ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 1306ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 1307ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius *iface_object = iface_object_iter->second; 1308ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 0; 1309ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 1310ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 1311ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius/** 1312ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Retrieve the |ISupplicantStaIface| hidl object reference using the provided 13138e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * ifname. 131432c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * 131532c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * @param ifname Name of the corresponding interface. 131657ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * @param iface_object Hidl reference corresponding to the iface. 131732c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * 131832c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * @return 0 on success, 1 on failure. 131932c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius */ 1320ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint HidlManager::getStaIfaceHidlObjectByIfname( 1321ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, android::sp<ISupplicantStaIface> *iface_object) 1322e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt{ 132332c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius if (ifname.empty() || !iface_object) 1324e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return 1; 1325e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 1326ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto iface_object_iter = sta_iface_object_map_.find(ifname); 1327ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (iface_object_iter == sta_iface_object_map_.end()) 1328e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return 1; 1329e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 13308e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius *iface_object = iface_object_iter->second; 1331e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return 0; 1332e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt} 1333e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 1334d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius/** 1335ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Retrieve the |ISupplicantP2pNetwork| hidl object reference using the provided 13368e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * ifname and network_id. 1337d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * 1338d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @param ifname Name of the corresponding interface. 1339d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @param network_id ID of the corresponding network. 134057ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * @param network_object Hidl reference corresponding to the network. 1341d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * 1342d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @return 0 on success, 1 on failure. 1343d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius */ 1344ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint HidlManager::getP2pNetworkHidlObjectByIfnameAndNetworkId( 1345d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius const std::string &ifname, int network_id, 1346ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius android::sp<ISupplicantP2pNetwork> *network_object) 1347d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius{ 1348d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius if (ifname.empty() || network_id < 0 || !network_object) 1349d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius return 1; 1350d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 1351d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius // Generate the key to be used to lookup the network. 1352d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius const std::string network_key = 1353d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius getNetworkObjectMapKey(ifname, network_id); 1354d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 1355ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto network_object_iter = p2p_network_object_map_.find(network_key); 1356ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (network_object_iter == p2p_network_object_map_.end()) 1357ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 1358ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 1359ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius *network_object = network_object_iter->second; 1360ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 0; 1361ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 1362ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 1363ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius/** 1364ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Retrieve the |ISupplicantStaNetwork| hidl object reference using the provided 1365ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * ifname and network_id. 1366ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1367ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param ifname Name of the corresponding interface. 1368ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param network_id ID of the corresponding network. 1369ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param network_object Hidl reference corresponding to the network. 1370ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1371ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @return 0 on success, 1 on failure. 1372ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius */ 1373ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint HidlManager::getStaNetworkHidlObjectByIfnameAndNetworkId( 1374ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, int network_id, 1375ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius android::sp<ISupplicantStaNetwork> *network_object) 1376ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 1377ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (ifname.empty() || network_id < 0 || !network_object) 1378ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 1379ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 1380ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Generate the key to be used to lookup the network. 1381ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string network_key = 1382ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius getNetworkObjectMapKey(ifname, network_id); 1383ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 1384ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto network_object_iter = sta_network_object_map_.find(network_key); 1385ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (network_object_iter == sta_network_object_map_.end()) 1386d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius return 1; 1387d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 13888e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius *network_object = network_object_iter->second; 1389d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius return 0; 1390d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius} 1391d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 1392d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius/** 139357ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * Add a new |ISupplicantCallback| hidl object reference to our 13940470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * global callback list. 13950470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * 139657ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * @param callback Hidl reference of the |ISupplicantCallback| object. 13970470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * 13980470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * @return 0 on success, 1 on failure. 13990470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius */ 140057ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusint HidlManager::addSupplicantCallbackHidlObject( 14017c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius const android::sp<ISupplicantCallback> &callback) 14020470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius{ 14038e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius // Register for death notification before we add it to our list. 140457ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius auto on_hidl_died_fctor = std::bind( 140557ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius &HidlManager::removeSupplicantCallbackHidlObject, this, 14068e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius std::placeholders::_1); 140757ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius return registerForDeathAndAddCallbackHidlObjectToList< 14087c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius ISupplicantCallback>( 140957ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius callback, on_hidl_died_fctor, supplicant_callbacks_); 14100470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius} 1411ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 14120470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius/** 1413ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Add a new iface callback hidl object reference to our 14140470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * interface callback list. 14150470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * 14160470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * @param ifname Name of the corresponding interface. 1417ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param callback Hidl reference of the callback object. 14180470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * 14190470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * @return 0 on success, 1 on failure. 14200470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius */ 1421ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint HidlManager::addP2pIfaceCallbackHidlObject( 14220470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius const std::string &ifname, 1423ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantP2pIfaceCallback> &callback) 14240470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius{ 1425ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function<void( 1426ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantP2pIfaceCallback> &)> 1427ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius on_hidl_died_fctor = std::bind( 1428ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &HidlManager::removeP2pIfaceCallbackHidlObject, this, ifname, 1429ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::placeholders::_1); 1430ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return addIfaceCallbackHidlObjectToMap( 1431ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, callback, on_hidl_died_fctor, p2p_iface_callbacks_map_); 1432ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 14338e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius 1434ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius/** 1435ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Add a new iface callback hidl object reference to our 1436ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * interface callback list. 1437ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1438ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param ifname Name of the corresponding interface. 1439ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param callback Hidl reference of the callback object. 1440ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1441ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @return 0 on success, 1 on failure. 1442ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius */ 1443ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint HidlManager::addStaIfaceCallbackHidlObject( 1444ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, 1445ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantStaIfaceCallback> &callback) 1446ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 1447ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function<void( 1448ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantStaIfaceCallback> &)> 1449ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius on_hidl_died_fctor = std::bind( 1450ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &HidlManager::removeStaIfaceCallbackHidlObject, this, ifname, 1451ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::placeholders::_1); 1452ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return addIfaceCallbackHidlObjectToMap( 1453ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, callback, on_hidl_died_fctor, sta_iface_callbacks_map_); 14540470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius} 14550470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius 14560470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius/** 1457ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Add a new network callback hidl object reference to our network callback 1458ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * list. 14590470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * 14600470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * @param ifname Name of the corresponding interface. 14610470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * @param network_id ID of the corresponding network. 1462ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param callback Hidl reference of the callback object. 14630470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * 14640470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * @return 0 on success, 1 on failure. 14650470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius */ 1466ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint HidlManager::addP2pNetworkCallbackHidlObject( 14670470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius const std::string &ifname, int network_id, 1468ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantP2pNetworkCallback> &callback) 14690470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius{ 1470ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function<void( 1471ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantP2pNetworkCallback> &)> 1472ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius on_hidl_died_fctor = std::bind( 1473ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &HidlManager::removeP2pNetworkCallbackHidlObject, this, ifname, 1474ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius network_id, std::placeholders::_1); 1475ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return addNetworkCallbackHidlObjectToMap( 1476ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, network_id, callback, on_hidl_died_fctor, 1477ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius p2p_network_callbacks_map_); 14780470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius} 14790470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius 14800470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius/** 1481ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Add a new network callback hidl object reference to our network callback 1482ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * list. 1483d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * 1484d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @param ifname Name of the corresponding interface. 1485d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @param network_id ID of the corresponding network. 1486ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param callback Hidl reference of the callback object. 1487ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1488ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @return 0 on success, 1 on failure. 1489d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius */ 1490ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint HidlManager::addStaNetworkCallbackHidlObject( 1491ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, int network_id, 1492ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantStaNetworkCallback> &callback) 1493d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius{ 1494ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function<void( 1495ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantStaNetworkCallback> &)> 1496ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius on_hidl_died_fctor = std::bind( 1497ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &HidlManager::removeStaNetworkCallbackHidlObject, this, ifname, 1498ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius network_id, std::placeholders::_1); 1499ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return addNetworkCallbackHidlObjectToMap( 1500ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, network_id, callback, on_hidl_died_fctor, 1501ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius sta_network_callbacks_map_); 1502d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius} 15038e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius 15048e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius/** 150557ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * Removes the provided |ISupplicantCallback| hidl object reference 15068e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * from our global callback list. 15078e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * 150857ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * @param callback Hidl reference of the |ISupplicantCallback| object. 15098e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius */ 151057ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusvoid HidlManager::removeSupplicantCallbackHidlObject( 15117c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius const android::sp<ISupplicantCallback> &callback) 15128e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius{ 15138e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius supplicant_callbacks_.erase( 15148e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius std::remove( 15158e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius supplicant_callbacks_.begin(), supplicant_callbacks_.end(), 15168e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius callback), 15178e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius supplicant_callbacks_.end()); 15188e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius} 15198e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius 15208e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius/** 1521ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Removes the provided iface callback hidl object reference from 15228e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * our interface callback list. 15238e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * 15248e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * @param ifname Name of the corresponding interface. 1525ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param callback Hidl reference of the callback object. 15268e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius */ 1527ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid HidlManager::removeP2pIfaceCallbackHidlObject( 15288e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius const std::string &ifname, 1529ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantP2pIfaceCallback> &callback) 15308e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius{ 1531ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return removeIfaceCallbackHidlObjectFromMap( 1532ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, callback, p2p_iface_callbacks_map_); 1533ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 15348e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius 1535ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius/** 1536ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Removes the provided iface callback hidl object reference from 1537ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * our interface callback list. 1538ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1539ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param ifname Name of the corresponding interface. 1540ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param callback Hidl reference of the callback object. 1541ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius */ 1542ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid HidlManager::removeStaIfaceCallbackHidlObject( 1543ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, 1544ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantStaIfaceCallback> &callback) 1545ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 1546ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return removeIfaceCallbackHidlObjectFromMap( 1547ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, callback, sta_iface_callbacks_map_); 15488e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius} 15498e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius 15508e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius/** 1551ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Removes the provided network callback hidl object reference from 15528e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * our network callback list. 15538e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * 15548e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * @param ifname Name of the corresponding interface. 15558e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * @param network_id ID of the corresponding network. 1556ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param callback Hidl reference of the callback object. 15578e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius */ 1558ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid HidlManager::removeP2pNetworkCallbackHidlObject( 15598e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius const std::string &ifname, int network_id, 1560ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantP2pNetworkCallback> &callback) 15618e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius{ 1562ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return removeNetworkCallbackHidlObjectFromMap( 1563ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, network_id, callback, p2p_network_callbacks_map_); 15648e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius} 15658e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius 15668e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius/** 1567ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Removes the provided network callback hidl object reference from 1568ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * our network callback list. 15698e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * 1570ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param ifname Name of the corresponding interface. 1571ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param network_id ID of the corresponding network. 1572ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param callback Hidl reference of the callback object. 15738e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius */ 1574ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid HidlManager::removeStaNetworkCallbackHidlObject( 1575ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, int network_id, 1576ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantStaNetworkCallback> &callback) 15778e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius{ 1578ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return removeNetworkCallbackHidlObjectFromMap( 1579ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, network_id, callback, sta_network_callbacks_map_); 15808e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius} 15812d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius 15822d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius/** 15832d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * Helper function to invoke the provided callback method on all the 158457ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * registered |ISupplicantCallback| callback hidl objects. 15852d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * 158657ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * @param method Pointer to the required hidl method from 15872d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * |ISupplicantCallback|. 15882d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius */ 158957ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusvoid HidlManager::callWithEachSupplicantCallback( 15907c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius const std::function<Return<void>(android::sp<ISupplicantCallback>)> &method) 15912d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius{ 15922d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius for (const auto &callback : supplicant_callbacks_) { 1593cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius if (!method(callback).isOk()) { 1594cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius wpa_printf(MSG_ERROR, "Failed to invoke HIDL callback"); 1595cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius } 15962d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius } 15972d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius} 15982d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius 15992d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius/** 16002d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * Helper fucntion to invoke the provided callback method on all the 1601ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * registered iface callback hidl objects for the specified 16022d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * |ifname|. 16032d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * 16042d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * @param ifname Name of the corresponding interface. 16057c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * @param method Pointer to the required hidl method from 16067c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * |ISupplicantIfaceCallback|. 16072d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius */ 1608ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid HidlManager::callWithEachP2pIfaceCallback( 16092d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius const std::string &ifname, 1610ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function<Return<void>(android::sp<ISupplicantP2pIfaceCallback>)> 16117c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius &method) 16122d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius{ 1613ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callWithEachIfaceCallback(ifname, method, p2p_iface_callbacks_map_); 1614ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 16152d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius 1616ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius/** 1617ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Helper fucntion to invoke the provided callback method on all the 1618ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * registered iface callback hidl objects for the specified 1619ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * |ifname|. 1620ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1621ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param ifname Name of the corresponding interface. 1622ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param method Pointer to the required hidl method from 1623ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * |ISupplicantIfaceCallback|. 1624ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius */ 1625ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid HidlManager::callWithEachStaIfaceCallback( 1626ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, 1627ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function<Return<void>(android::sp<ISupplicantStaIfaceCallback>)> 1628ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &method) 1629ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 1630ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callWithEachIfaceCallback(ifname, method, sta_iface_callbacks_map_); 16312d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius} 16322d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius 16332d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius/** 16342d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * Helper function to invoke the provided callback method on all the 1635ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * registered network callback hidl objects for the specified 16362d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * |ifname| & |network_id|. 16372d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * 16382d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * @param ifname Name of the corresponding interface. 16392d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * @param network_id ID of the corresponding network. 16407c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * @param method Pointer to the required hidl method from 1641ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * |ISupplicantP2pNetworkCallback| or |ISupplicantStaNetworkCallback| . 16422d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius */ 1643ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid HidlManager::callWithEachP2pNetworkCallback( 16442d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius const std::string &ifname, int network_id, 1645ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function< 1646ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius Return<void>(android::sp<ISupplicantP2pNetworkCallback>)> &method) 16472d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius{ 1648ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callWithEachNetworkCallback( 1649ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, network_id, method, p2p_network_callbacks_map_); 16502d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius} 16517c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 1652ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius/** 1653ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Helper function to invoke the provided callback method on all the 1654ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * registered network callback hidl objects for the specified 1655ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * |ifname| & |network_id|. 1656ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1657ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param ifname Name of the corresponding interface. 1658ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param network_id ID of the corresponding network. 1659ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param method Pointer to the required hidl method from 1660ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * |ISupplicantP2pNetworkCallback| or |ISupplicantStaNetworkCallback| . 1661ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius */ 1662ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid HidlManager::callWithEachStaNetworkCallback( 1663ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, int network_id, 1664ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function< 1665ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius Return<void>(android::sp<ISupplicantStaNetworkCallback>)> &method) 1666ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 1667ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callWithEachNetworkCallback( 1668ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, network_id, method, sta_network_callbacks_map_); 1669ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 16707c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace implementation 16717c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace V1_0 16727c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace wifi 16737c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace supplicant 16747c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace hardware 16757c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace android 1676