1e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt/* 257ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * hidl interface for wpa_supplicant daemon 3e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt * Copyright (c) 2004-2016, Jouni Malinen <j@w1.fi> 4e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt * Copyright (c) 2004-2016, Roshan Pius <rpius@google.com> 5e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt * 6e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt * This software may be distributed under the terms of the BSD license. 7e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt * See README for more details. 8e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt */ 9e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 108e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius#include <algorithm> 118366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius#include <regex> 128e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius 1357ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius#include "hidl_manager.h" 148894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius#include "misc_utils.h" 15e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 168366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piusextern "C" { 178366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius#include "src/eap_common/eap_sim_common.h" 188366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius} 198366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius 20ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusnamespace { 218366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piususing android::hardware::hidl_array; 228366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius 2357fad9a718371163b615f2091588abb1ca2702fbRoshan Piusconstexpr uint8_t kWfdDeviceInfoLen = 6; 248366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius// GSM-AUTH:<RAND1>:<RAND2>[:<RAND3>] 258366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piusconstexpr char kGsmAuthRegex2[] = "GSM-AUTH:([0-9a-f]+):([0-9a-f]+)"; 268366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piusconstexpr char kGsmAuthRegex3[] = 278366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius "GSM-AUTH:([0-9a-f]+):([0-9a-f]+):([0-9a-f]+)"; 288366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius// UMTS-AUTH:<RAND>:<AUTN> 298366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piusconstexpr char kUmtsAuthRegex[] = "UMTS-AUTH:([0-9a-f]+):([0-9a-f]+)"; 308366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piusconstexpr size_t kGsmRandLenBytes = GSM_RAND_LEN; 318366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piusconstexpr size_t kUmtsRandLenBytes = EAP_AKA_RAND_LEN; 328366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piusconstexpr size_t kUmtsAutnLenBytes = EAP_AKA_AUTN_LEN; 33b3758b2e318490b67422bf8a2256d6cf6534b41bGlen Kuhneconstexpr u8 kZeroBssid[6] = {0, 0, 0, 0, 0, 0}; 34ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius/** 35ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Check if the provided |wpa_supplicant| structure represents a P2P iface or 36ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * not. 37ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius */ 38ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusconstexpr bool isP2pIface(const struct wpa_supplicant *wpa_s) 39ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 40ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return (wpa_s->global->p2p_init_wpa_s == wpa_s); 41ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 42ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 43ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius/** 44ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Creates a unique key for the network using the provided |ifname| and 45ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * |network_id| to be used in the internal map of |ISupplicantNetwork| objects. 46ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * This is of the form |ifname|_|network_id|. For ex: "wlan0_1". 47ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 48ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param ifname Name of the corresponding interface. 49ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param network_id ID of the corresponding network. 50ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius */ 51ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusconst std::string getNetworkObjectMapKey( 52ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, int network_id) 53ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 54ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return ifname + "_" + std::to_string(network_id); 55ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 56ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 57ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius/** 58ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Add callback to the corresponding list after linking to death on the 59ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * corresponding hidl object reference. 60ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius */ 61ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class CallbackType> 62ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint registerForDeathAndAddCallbackHidlObjectToList( 63ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<CallbackType> &callback, 64ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function<void(const android::sp<CallbackType> &)> 65ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &on_hidl_died_fctor, 66ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::vector<android::sp<CallbackType>> &callback_list) 67ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 68ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius#if 0 // TODO(b/31632518): HIDL object death notifications. 69ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto death_notifier = new CallbackObjectDeathNotifier<CallbackType>( 70ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callback, on_hidl_died_fctor); 71ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Use the |callback.get()| as cookie so that we don't need to 72ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // store a reference to this |CallbackObjectDeathNotifier| instance 73ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // to use in |unlinkToDeath| later. 74ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // NOTE: This may cause an immediate callback if the object is already 75ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // dead, so add it to the list before we register for callback! 76ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (android::hardware::IInterface::asBinder(callback)->linkToDeath( 77ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius death_notifier, callback.get()) != android::OK) { 78ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius wpa_printf( 79ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius MSG_ERROR, 80ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius "Error registering for death notification for " 81ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius "supplicant callback object"); 82ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callback_list.erase( 83ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::remove( 84ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callback_list.begin(), callback_list.end(), callback), 85ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callback_list.end()); 86ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 87ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 88ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius#endif // TODO(b/31632518): HIDL object death notifications. 89ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callback_list.push_back(callback); 90ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 0; 91e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt} 92e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 93ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class ObjectType> 94ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint addHidlObjectToMap( 95ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &key, const android::sp<ObjectType> object, 96ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::map<const std::string, android::sp<ObjectType>> &object_map) 97ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 98ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Return failure if we already have an object for that |key|. 99ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (object_map.find(key) != object_map.end()) 100ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 101ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius object_map[key] = object; 102ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (!object_map[key].get()) 103ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 104ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 0; 105ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 106ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 107ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class ObjectType> 108ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint removeHidlObjectFromMap( 109ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &key, 110ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::map<const std::string, android::sp<ObjectType>> &object_map) 111ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 112ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Return failure if we dont have an object for that |key|. 11319f21dcdb1ecf8504efef43a384b1b81b9dee905Roshan Pius const auto &object_iter = object_map.find(key); 11419f21dcdb1ecf8504efef43a384b1b81b9dee905Roshan Pius if (object_iter == object_map.end()) 115ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 11619f21dcdb1ecf8504efef43a384b1b81b9dee905Roshan Pius object_iter->second->invalidate(); 11719f21dcdb1ecf8504efef43a384b1b81b9dee905Roshan Pius object_map.erase(object_iter); 118ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 0; 119ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 120ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 121ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class CallbackType> 122ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint addIfaceCallbackHidlObjectToMap( 123ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, const android::sp<CallbackType> &callback, 124ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function<void(const android::sp<CallbackType> &)> 125ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &on_hidl_died_fctor, 126ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::map<const std::string, std::vector<android::sp<CallbackType>>> 127ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &callbacks_map) 128ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 129ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (ifname.empty()) 130ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 131ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 132ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto iface_callback_map_iter = callbacks_map.find(ifname); 133ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (iface_callback_map_iter == callbacks_map.end()) 134ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 135ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto &iface_callback_list = iface_callback_map_iter->second; 136ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 137ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Register for death notification before we add it to our list. 138ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return registerForDeathAndAddCallbackHidlObjectToList<CallbackType>( 139ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callback, on_hidl_died_fctor, iface_callback_list); 140ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 141ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 142ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class CallbackType> 143ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint addNetworkCallbackHidlObjectToMap( 144ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, int network_id, 145ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<CallbackType> &callback, 146ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function<void(const android::sp<CallbackType> &)> 147ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &on_hidl_died_fctor, 148ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::map<const std::string, std::vector<android::sp<CallbackType>>> 149ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &callbacks_map) 150ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 151ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (ifname.empty() || network_id < 0) 152ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 153ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 154ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Generate the key to be used to lookup the network. 155ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string network_key = 156ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius getNetworkObjectMapKey(ifname, network_id); 157ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto network_callback_map_iter = callbacks_map.find(network_key); 158ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (network_callback_map_iter == callbacks_map.end()) 159ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 160ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto &network_callback_list = network_callback_map_iter->second; 161ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 162ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Register for death notification before we add it to our list. 163ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return registerForDeathAndAddCallbackHidlObjectToList<CallbackType>( 164ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callback, on_hidl_died_fctor, network_callback_list); 165ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 166ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 167ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class CallbackType> 168ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint removeAllIfaceCallbackHidlObjectsFromMap( 169ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, 170ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::map<const std::string, std::vector<android::sp<CallbackType>>> 171ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &callbacks_map) 172ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 173ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto iface_callback_map_iter = callbacks_map.find(ifname); 174ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (iface_callback_map_iter == callbacks_map.end()) 175ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 176ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius#if 0 // TODO(b/31632518): HIDL object death notifications. 177ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const auto &iface_callback_list = iface_callback_map_iter->second; 178ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius for (const auto &callback : iface_callback_list) { 179ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (android::hardware::IInterface::asBinder(callback) 180ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ->unlinkToDeath(nullptr, callback.get()) != 181ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius android::OK) { 182ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius wpa_printf( 183ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius MSG_ERROR, 184ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius "Error deregistering for death notification for " 185ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius "iface callback object"); 186ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 187ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 188ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius#endif // TODO(b/31632518): HIDL object death notifications. 189ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callbacks_map.erase(iface_callback_map_iter); 190ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 0; 191ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 192ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 193ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class CallbackType> 194ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint removeAllNetworkCallbackHidlObjectsFromMap( 195ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &network_key, 196ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::map<const std::string, std::vector<android::sp<CallbackType>>> 197ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &callbacks_map) 198ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 199ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto network_callback_map_iter = callbacks_map.find(network_key); 200ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (network_callback_map_iter == callbacks_map.end()) 201ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 202ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius#if 0 // TODO(b/31632518): HIDL object death notifications. 203ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const auto &network_callback_list = network_callback_map_iter->second; 204ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius for (const auto &callback : network_callback_list) { 205ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (android::hardware::IInterface::asBinder(callback) 206ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ->unlinkToDeath(nullptr, callback.get()) != 207ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius android::OK) { 208ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius wpa_printf( 209ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius MSG_ERROR, 210ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius "Error deregistering for death " 211ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius "notification for " 212ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius "network callback object"); 213ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 214ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 215ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius#endif // TODO(b/31632518): HIDL object death notifications. 216ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callbacks_map.erase(network_callback_map_iter); 217ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 0; 218ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 219ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 220ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class CallbackType> 221ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid removeIfaceCallbackHidlObjectFromMap( 222ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, const android::sp<CallbackType> &callback, 223ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::map<const std::string, std::vector<android::sp<CallbackType>>> 224ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &callbacks_map) 225ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 226ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (ifname.empty()) 227ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return; 228ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 229ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto iface_callback_map_iter = callbacks_map.find(ifname); 230ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (iface_callback_map_iter == callbacks_map.end()) 231ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return; 232ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 233ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto &iface_callback_list = iface_callback_map_iter->second; 234ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius iface_callback_list.erase( 235ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::remove( 236ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius iface_callback_list.begin(), iface_callback_list.end(), 237ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callback), 238ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius iface_callback_list.end()); 239ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 240ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 241ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class CallbackType> 242ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid removeNetworkCallbackHidlObjectFromMap( 243ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, int network_id, 244ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<CallbackType> &callback, 245ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::map<const std::string, std::vector<android::sp<CallbackType>>> 246ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &callbacks_map) 247ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 248ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (ifname.empty() || network_id < 0) 249ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return; 250ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 251ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Generate the key to be used to lookup the network. 252ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string network_key = 253ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius getNetworkObjectMapKey(ifname, network_id); 254ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 255ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto network_callback_map_iter = callbacks_map.find(network_key); 256ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (network_callback_map_iter == callbacks_map.end()) 257ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return; 258ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 259ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto &network_callback_list = network_callback_map_iter->second; 260ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius network_callback_list.erase( 261ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::remove( 262ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius network_callback_list.begin(), network_callback_list.end(), 263ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callback), 264ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius network_callback_list.end()); 265ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 266ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 267ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class CallbackType> 268ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid callWithEachIfaceCallback( 269ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, 270ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function< 271ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius android::hardware::Return<void>(android::sp<CallbackType>)> &method, 272ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::map<const std::string, std::vector<android::sp<CallbackType>>> 273ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &callbacks_map) 274ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 275ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (ifname.empty()) 276ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return; 277ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 278ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto iface_callback_map_iter = callbacks_map.find(ifname); 279ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (iface_callback_map_iter == callbacks_map.end()) 280ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return; 281ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const auto &iface_callback_list = iface_callback_map_iter->second; 282ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius for (const auto &callback : iface_callback_list) { 283cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius if (!method(callback).isOk()) { 284cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius wpa_printf( 285cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius MSG_ERROR, "Failed to invoke HIDL iface callback"); 286cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius } 287ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 288ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 289ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 290ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piustemplate <class CallbackType> 291ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid callWithEachNetworkCallback( 292ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, int network_id, 293ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function< 294ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius android::hardware::Return<void>(android::sp<CallbackType>)> &method, 295ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::map<const std::string, std::vector<android::sp<CallbackType>>> 296ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &callbacks_map) 297ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 298ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (ifname.empty() || network_id < 0) 299ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return; 300ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 301ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Generate the key to be used to lookup the network. 302ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string network_key = 303ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius getNetworkObjectMapKey(ifname, network_id); 304ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto network_callback_map_iter = callbacks_map.find(network_key); 305ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (network_callback_map_iter == callbacks_map.end()) 306ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return; 307ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const auto &network_callback_list = network_callback_map_iter->second; 308ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius for (const auto &callback : network_callback_list) { 309cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius if (!method(callback).isOk()) { 310cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius wpa_printf( 311cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius MSG_ERROR, 312cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius "Failed to invoke HIDL network callback"); 313cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius } 314ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 315ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 3169322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 3178366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piusint parseGsmAuthNetworkRequest( 3188366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius const std::string ¶ms_str, 3198366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::vector<hidl_array<uint8_t, kGsmRandLenBytes>> *out_rands) 3208366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius{ 3218366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::smatch matches; 3228366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::regex params_gsm_regex2(kGsmAuthRegex2); 3238366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::regex params_gsm_regex3(kGsmAuthRegex3); 3248366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius if (!std::regex_match(params_str, matches, params_gsm_regex3) && 3258366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius !std::regex_match(params_str, matches, params_gsm_regex2)) { 3268366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 1; 3278366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 3288366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius for (uint32_t i = 1; i < matches.size(); i++) { 3298366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius hidl_array<uint8_t, kGsmRandLenBytes> rand; 3308366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius const auto &match = matches[i]; 3318366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius WPA_ASSERT(match.size() >= 2 * rand.size()); 3328366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius if (hexstr2bin(match.str().c_str(), rand.data(), rand.size())) { 3338366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius wpa_printf( 3348366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius MSG_ERROR, "Failed to parse GSM auth params"); 3358366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 1; 3368366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 3378366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius out_rands->push_back(rand); 3388366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 3398366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 0; 3408366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius} 3418366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius 3428366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Piusint parseUmtsAuthNetworkRequest( 3438366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius const std::string ¶ms_str, 3448366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius hidl_array<uint8_t, kUmtsRandLenBytes> *out_rand, 3458366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius hidl_array<uint8_t, kUmtsAutnLenBytes> *out_autn) 3468366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius{ 3478366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::smatch matches; 3488366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::regex params_umts_regex(kUmtsAuthRegex); 3498366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius if (!std::regex_match(params_str, matches, params_umts_regex)) { 3508366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 1; 3518366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 3528366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius WPA_ASSERT(matches[1].size() >= 2 * out_rand->size()); 3538366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius if (hexstr2bin( 3548366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius matches[1].str().c_str(), out_rand->data(), out_rand->size())) { 3558366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius wpa_printf(MSG_ERROR, "Failed to parse UMTS auth params"); 3568366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 1; 3578366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 3588366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius WPA_ASSERT(matches[2].size() >= 2 * out_autn->size()); 3598366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius if (hexstr2bin( 3608366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius matches[2].str().c_str(), out_autn->data(), out_autn->size())) { 3618366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius wpa_printf(MSG_ERROR, "Failed to parse UMTS auth params"); 3628366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 1; 3638366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 3648366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 0; 3658366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius} 366ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} // namespace 367ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 3687c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace android { 3697c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace hardware { 3707c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace wifi { 3717c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace supplicant { 3727c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace V1_0 { 3737c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace implementation { 374e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 37557ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan PiusHidlManager *HidlManager::instance_ = NULL; 376e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 37757ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan PiusHidlManager *HidlManager::getInstance() 378e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt{ 379e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt if (!instance_) 38057ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius instance_ = new HidlManager(); 381e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return instance_; 382e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt} 383e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 38457ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusvoid HidlManager::destroyInstance() 385e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt{ 386e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt if (instance_) 387e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt delete instance_; 388e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt instance_ = NULL; 389e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt} 390e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 39157ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusint HidlManager::registerHidlService(struct wpa_global *global) 392e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt{ 3937c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius // Create the main hidl service object and register it. 394e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt supplicant_object_ = new Supplicant(global); 39594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius if (supplicant_object_->registerAsService() != android::NO_ERROR) { 3967c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius return 1; 3977c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius } 398e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return 0; 399e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt} 400e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 40132c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius/** 40257ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * Register an interface to hidl manager. 40332c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * 40432c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface. 40532c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * 40632c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * @return 0 on success, 1 on failure. 40732c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius */ 40857ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusint HidlManager::registerInterface(struct wpa_supplicant *wpa_s) 409e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt{ 410e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt if (!wpa_s) 411e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return 1; 412e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 413ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (isP2pIface(wpa_s)) { 414ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (addHidlObjectToMap<P2pIface>( 415fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 416fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius new P2pIface(wpa_s->global, wpa_s->ifname), 4177ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius p2p_iface_object_map_)) { 4187ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius wpa_printf( 4197ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius MSG_ERROR, 4207ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "Failed to register P2P interface with HIDL " 4217ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "control: %s", 4227ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius wpa_s->ifname); 423ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 4247ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius } 425fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_callbacks_map_[wpa_s->ifname] = 426ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::vector<android::sp<ISupplicantP2pIfaceCallback>>(); 427ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } else { 428ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (addHidlObjectToMap<StaIface>( 429fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 430fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius new StaIface(wpa_s->global, wpa_s->ifname), 4317ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius sta_iface_object_map_)) { 4327ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius wpa_printf( 4337ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius MSG_ERROR, 4347ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "Failed to register STA interface with HIDL " 4357ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "control: %s", 4367ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius wpa_s->ifname); 437ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 4387ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius } 439fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_callbacks_map_[wpa_s->ifname] = 440ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::vector<android::sp<ISupplicantStaIfaceCallback>>(); 441ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 4422d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius 4437c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius // Invoke the |onInterfaceCreated| method on all registered callbacks. 4442d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius callWithEachSupplicantCallback(std::bind( 4457c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius &ISupplicantCallback::onInterfaceCreated, std::placeholders::_1, 446fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname)); 447e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return 0; 448e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt} 449e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 45032c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius/** 45157ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * Unregister an interface from hidl manager. 45232c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * 45332c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface. 45432c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * 45532c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * @return 0 on success, 1 on failure. 45632c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius */ 45757ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusint HidlManager::unregisterInterface(struct wpa_supplicant *wpa_s) 458e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt{ 45932c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius if (!wpa_s) 460e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return 1; 461e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 462ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (isP2pIface(wpa_s)) { 463fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (removeHidlObjectFromMap( 4647ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius wpa_s->ifname, p2p_iface_object_map_)) { 4657ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius wpa_printf( 4667ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius MSG_ERROR, 4677ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "Failed to unregister P2P interface with HIDL " 4687ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "control: %s", 4697ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius wpa_s->ifname); 470ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 4717ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius } 472ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (removeAllIfaceCallbackHidlObjectsFromMap( 473fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, p2p_iface_callbacks_map_)) { 474ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 475ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 476ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } else { 477fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (removeHidlObjectFromMap( 4787ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius wpa_s->ifname, sta_iface_object_map_)) { 4797ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius wpa_printf( 4807ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius MSG_ERROR, 4817ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "Failed to unregister STA interface with HIDL " 4827ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "control: %s", 4837ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius wpa_s->ifname); 484ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 4857ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius } 486ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (removeAllIfaceCallbackHidlObjectsFromMap( 487fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, sta_iface_callbacks_map_)) { 488ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 4898e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius } 4908e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius } 4912d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius 4927c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius // Invoke the |onInterfaceRemoved| method on all registered callbacks. 4932d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius callWithEachSupplicantCallback(std::bind( 4947c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius &ISupplicantCallback::onInterfaceRemoved, std::placeholders::_1, 495fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname)); 496e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return 0; 497e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt} 498e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 49932c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius/** 50057ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * Register a network to hidl manager. 501d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * 502d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface on which 503d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * the network is added. 504d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @param ssid |wpa_ssid| struct corresponding to the network being added. 505d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * 506d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @return 0 on success, 1 on failure. 507d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius */ 50857ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusint HidlManager::registerNetwork( 509d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid) 510d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius{ 511d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius if (!wpa_s || !ssid) 512d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius return 1; 513d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 514d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius // Generate the key to be used to lookup the network. 515d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius const std::string network_key = 516d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius getNetworkObjectMapKey(wpa_s->ifname, ssid->id); 517d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 518ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (isP2pIface(wpa_s)) { 519ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (addHidlObjectToMap<P2pNetwork>( 520ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius network_key, 521ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius new P2pNetwork(wpa_s->global, wpa_s->ifname, ssid->id), 5227ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius p2p_network_object_map_)) { 5237ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius wpa_printf( 5247ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius MSG_ERROR, 5257ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "Failed to register P2P network with HIDL " 5267ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "control: %d", 5277ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius ssid->id); 528ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 5297ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius } 530ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius p2p_network_callbacks_map_[network_key] = 531ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::vector<android::sp<ISupplicantP2pNetworkCallback>>(); 532ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Invoke the |onNetworkAdded| method on all registered 533ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // callbacks. 534ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callWithEachP2pIfaceCallback( 535ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius wpa_s->ifname, 536ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::bind( 537ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &ISupplicantP2pIfaceCallback::onNetworkAdded, 538ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::placeholders::_1, ssid->id)); 539ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } else { 540ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (addHidlObjectToMap<StaNetwork>( 541ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius network_key, 542ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius new StaNetwork(wpa_s->global, wpa_s->ifname, ssid->id), 5437ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius sta_network_object_map_)) { 5447ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius wpa_printf( 5457ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius MSG_ERROR, 5467ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "Failed to register STA network with HIDL " 5477ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "control: %d", 5487ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius ssid->id); 549ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 5507ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius } 551ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius sta_network_callbacks_map_[network_key] = 552ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::vector<android::sp<ISupplicantStaNetworkCallback>>(); 553ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Invoke the |onNetworkAdded| method on all registered 554ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // callbacks. 555ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callWithEachStaIfaceCallback( 556ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius wpa_s->ifname, 557ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::bind( 558ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &ISupplicantStaIfaceCallback::onNetworkAdded, 559ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::placeholders::_1, ssid->id)); 560ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } 561d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius return 0; 562d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius} 563d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 564d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius/** 56557ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * Unregister a network from hidl manager. 566d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * 567d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface on which 568d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * the network is added. 569d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @param ssid |wpa_ssid| struct corresponding to the network being added. 570d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * 571d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @return 0 on success, 1 on failure. 572d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius */ 57357ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusint HidlManager::unregisterNetwork( 574d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid) 575d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius{ 576d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius if (!wpa_s || !ssid) 577d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius return 1; 578d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 579d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius // Generate the key to be used to lookup the network. 580d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius const std::string network_key = 581d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius getNetworkObjectMapKey(wpa_s->ifname, ssid->id); 582d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 583ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (isP2pIface(wpa_s)) { 5847ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius if (removeHidlObjectFromMap( 5857ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius network_key, p2p_network_object_map_)) { 5867ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius wpa_printf( 5877ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius MSG_ERROR, 5887ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "Failed to unregister P2P network with HIDL " 5897ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "control: %d", 5907ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius ssid->id); 591ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 5927ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius } 593ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (removeAllNetworkCallbackHidlObjectsFromMap( 594ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius network_key, p2p_network_callbacks_map_)) 595ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 596ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 597ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Invoke the |onNetworkRemoved| method on all registered 598ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // callbacks. 599ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callWithEachP2pIfaceCallback( 600ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius wpa_s->ifname, 601ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::bind( 602ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &ISupplicantP2pIfaceCallback::onNetworkRemoved, 603ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::placeholders::_1, ssid->id)); 604ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius } else { 6057ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius if (removeHidlObjectFromMap( 6067ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius network_key, sta_network_object_map_)) { 6077ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius wpa_printf( 6087ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius MSG_ERROR, 6097ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "Failed to unregister STA network with HIDL " 6107ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius "control: %d", 6117ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius ssid->id); 612ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 6137ce826d06fe29d76a91a8264ffdbd21a08d6250bRoshan Pius } 614ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (removeAllNetworkCallbackHidlObjectsFromMap( 615ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius network_key, sta_network_callbacks_map_)) 616ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 617ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 618ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Invoke the |onNetworkRemoved| method on all registered 619ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // callbacks. 620ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callWithEachStaIfaceCallback( 621ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius wpa_s->ifname, 622ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::bind( 623ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &ISupplicantStaIfaceCallback::onNetworkRemoved, 624ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::placeholders::_1, ssid->id)); 6258e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius } 626e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius return 0; 627e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius} 628e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius 629e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius/** 630e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius * Notify all listeners about any state changes on a particular interface. 631e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius * 632e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface on which 633e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius * the state change event occured. 634e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius */ 63557ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusint HidlManager::notifyStateChange(struct wpa_supplicant *wpa_s) 636e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius{ 637e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius if (!wpa_s) 638e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius return 1; 639e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius 640fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 641fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 642e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius return 1; 643e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius 6447c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius // Invoke the |onStateChanged| method on all registered callbacks. 6457c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius uint32_t hidl_network_id = UINT32_MAX; 6467c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius std::vector<uint8_t> hidl_ssid; 647e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius if (wpa_s->current_ssid) { 6487c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius hidl_network_id = wpa_s->current_ssid->id; 6497c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius hidl_ssid.assign( 650e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius wpa_s->current_ssid->ssid, 651e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius wpa_s->current_ssid->ssid + wpa_s->current_ssid->ssid_len); 652e8d0d1655fa3b70b846e8669273f9248d1100137Roshan Pius } 653fbe5dd192c736ed382a9fc9e0d539247605b3d6bRoshan Pius uint8_t *bssid; 654fbe5dd192c736ed382a9fc9e0d539247605b3d6bRoshan Pius // wpa_supplicant sets the |pending_bssid| field when it starts a 655fbe5dd192c736ed382a9fc9e0d539247605b3d6bRoshan Pius // connection. Only after association state does it update the |bssid| 656fbe5dd192c736ed382a9fc9e0d539247605b3d6bRoshan Pius // field. So, in the HIDL callback send the appropriate bssid. 657fbe5dd192c736ed382a9fc9e0d539247605b3d6bRoshan Pius if (wpa_s->wpa_state <= WPA_ASSOCIATED) { 658fbe5dd192c736ed382a9fc9e0d539247605b3d6bRoshan Pius bssid = wpa_s->pending_bssid; 659fbe5dd192c736ed382a9fc9e0d539247605b3d6bRoshan Pius } else { 660fbe5dd192c736ed382a9fc9e0d539247605b3d6bRoshan Pius bssid = wpa_s->bssid; 661fbe5dd192c736ed382a9fc9e0d539247605b3d6bRoshan Pius } 662ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callWithEachStaIfaceCallback( 6637c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius wpa_s->ifname, std::bind( 664ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &ISupplicantStaIfaceCallback::onStateChanged, 665fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, 666fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius static_cast<ISupplicantStaIfaceCallback::State>( 667fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->wpa_state), 668fbe5dd192c736ed382a9fc9e0d539247605b3d6bRoshan Pius bssid, hidl_network_id, hidl_ssid)); 669d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius return 0; 670d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius} 671d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 672d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius/** 67365628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius * Notify all listeners about a request on a particular network. 67465628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius * 67565628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface on which 67665628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius * the network is present. 67765628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius * @param ssid |wpa_ssid| struct corresponding to the network. 67865628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius * @param type type of request. 67965628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius * @param param addition params associated with the request. 68065628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius */ 68157ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusint HidlManager::notifyNetworkRequest( 68265628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid, int type, 68365628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius const char *param) 68465628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius{ 68565628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius if (!wpa_s || !ssid) 68665628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius return 1; 68765628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius 68865628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius const std::string network_key = 68965628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius getNetworkObjectMapKey(wpa_s->ifname, ssid->id); 690ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (sta_network_object_map_.find(network_key) == 691ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius sta_network_object_map_.end()) 69265628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius return 1; 69365628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius 6948366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius if (type == WPA_CTRL_REQ_EAP_IDENTITY) { 6958366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius callWithEachStaNetworkCallback( 6968366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius wpa_s->ifname, ssid->id, 6978366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::bind( 6988366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius &ISupplicantStaNetworkCallback:: 6998366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius onNetworkEapIdentityRequest, 7008366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::placeholders::_1)); 7018366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 0; 7028366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 7038366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius if (type == WPA_CTRL_REQ_SIM) { 7048366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::vector<hidl_array<uint8_t, 16>> gsm_rands; 7058366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius hidl_array<uint8_t, 16> umts_rand; 7068366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius hidl_array<uint8_t, 16> umts_autn; 7078366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius if (!parseGsmAuthNetworkRequest(param, &gsm_rands)) { 7088366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius ISupplicantStaNetworkCallback:: 7098366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius NetworkRequestEapSimGsmAuthParams hidl_params; 7108366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius hidl_params.rands = gsm_rands; 7118366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius callWithEachStaNetworkCallback( 7128366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius wpa_s->ifname, ssid->id, 7138366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::bind( 7148366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius &ISupplicantStaNetworkCallback:: 7158366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius onNetworkEapSimGsmAuthRequest, 7168366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::placeholders::_1, hidl_params)); 7178366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 0; 7188366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 7198366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius if (!parseUmtsAuthNetworkRequest( 7208366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius param, &umts_rand, &umts_autn)) { 7218366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius ISupplicantStaNetworkCallback:: 7228366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius NetworkRequestEapSimUmtsAuthParams hidl_params; 7238366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius hidl_params.rand = umts_rand; 7248366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius hidl_params.autn = umts_autn; 7258366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius callWithEachStaNetworkCallback( 7268366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius wpa_s->ifname, ssid->id, 7278366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::bind( 7288366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius &ISupplicantStaNetworkCallback:: 7298366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius onNetworkEapSimUmtsAuthRequest, 7308366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius std::placeholders::_1, hidl_params)); 7318366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 0; 7328366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 7338366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius } 7348366dc25ad182c0a43b6edd86f0b6164e77ee0d5Roshan Pius return 1; 73565628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius} 73665628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius 73765628ce79afddd4ba8fd796246b546b36815a0ddRoshan Pius/** 7389322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * Notify all listeners about the end of an ANQP query. 7399322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * 7409322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface. 7419322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param bssid BSSID of the access point. 7429322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param result Result of the operation ("SUCCESS" or "FAILURE"). 7439322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param anqp |wpa_bss_anqp| ANQP data fetched. 7449322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius */ 7459322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Piusvoid HidlManager::notifyAnqpQueryDone( 7469322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius struct wpa_supplicant *wpa_s, const u8 *bssid, const char *result, 7479322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius const struct wpa_bss_anqp *anqp) 7489322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius{ 7499322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius if (!wpa_s || !bssid || !result || !anqp) 7509322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius return; 7519322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 752fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 753fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 7549322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius return; 7559322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 7569322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius ISupplicantStaIfaceCallback::AnqpData hidl_anqp_data; 7579322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius ISupplicantStaIfaceCallback::Hs20AnqpData hidl_hs20_anqp_data; 7589322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius if (std::string(result) == "SUCCESS") { 7599322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_anqp_data.venueName = 7608894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius misc_utils::convertWpaBufToVector(anqp->venue_name); 7619322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_anqp_data.roamingConsortium = 7628894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius misc_utils::convertWpaBufToVector(anqp->roaming_consortium); 7639322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_anqp_data.ipAddrTypeAvailability = 7648894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius misc_utils::convertWpaBufToVector( 7658894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius anqp->ip_addr_type_availability); 7669322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_anqp_data.naiRealm = 7678894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius misc_utils::convertWpaBufToVector(anqp->nai_realm); 7689322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_anqp_data.anqp3gppCellularNetwork = 7698894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius misc_utils::convertWpaBufToVector(anqp->anqp_3gpp); 7709322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_anqp_data.domainName = 7718894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius misc_utils::convertWpaBufToVector(anqp->domain_name); 7729322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 7739322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_hs20_anqp_data.operatorFriendlyName = 7748894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius misc_utils::convertWpaBufToVector( 7758894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius anqp->hs20_operator_friendly_name); 7769322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_hs20_anqp_data.wanMetrics = 7778894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius misc_utils::convertWpaBufToVector(anqp->hs20_wan_metrics); 7789322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_hs20_anqp_data.connectionCapability = 7798894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius misc_utils::convertWpaBufToVector( 7808894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius anqp->hs20_connection_capability); 7819322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_hs20_anqp_data.osuProvidersList = 7828894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius misc_utils::convertWpaBufToVector( 7838894db2d5038bc2b765949f41f24582f2c197af5Roshan Pius anqp->hs20_osu_providers_list); 7849322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius } 7859322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 7869322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius callWithEachStaIfaceCallback( 7879322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius wpa_s->ifname, std::bind( 7889322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius &ISupplicantStaIfaceCallback::onAnqpQueryDone, 789fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, bssid, hidl_anqp_data, 790fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius hidl_hs20_anqp_data)); 7919322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius} 7929322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 7939322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius/** 7949322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * Notify all listeners about the end of an HS20 icon query. 7959322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * 7969322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface. 7979322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param bssid BSSID of the access point. 7989322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param file_name Name of the icon file. 7999322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param image Raw bytes of the icon file. 8009322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param image_length Size of the the icon file. 8019322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius */ 8029322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Piusvoid HidlManager::notifyHs20IconQueryDone( 8039322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius struct wpa_supplicant *wpa_s, const u8 *bssid, const char *file_name, 8049322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius const u8 *image, u32 image_length) 8059322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius{ 8069322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius if (!wpa_s || !bssid || !file_name || !image) 8079322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius return; 8089322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 809fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 810fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 8119322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius return; 8129322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 8139322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius callWithEachStaIfaceCallback( 8149322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius wpa_s->ifname, 8159322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius std::bind( 8169322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius &ISupplicantStaIfaceCallback::onHs20IconQueryDone, 817fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, bssid, file_name, 818fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::vector<uint8_t>(image, image + image_length))); 8199322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius} 8209322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 8219322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius/** 8229322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * Notify all listeners about the reception of HS20 subscription 8239322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * remediation notification from the server. 8249322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * 8259322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface. 8269322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param url URL of the server. 8279322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param osu_method OSU method (OMA_DM or SOAP_XML_SPP). 8289322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius */ 8299322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Piusvoid HidlManager::notifyHs20RxSubscriptionRemediation( 8309322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius struct wpa_supplicant *wpa_s, const char *url, u8 osu_method) 8319322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius{ 8329322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius if (!wpa_s || !url) 8339322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius return; 8349322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 835fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 836fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 8379322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius return; 8389322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 8399322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius ISupplicantStaIfaceCallback::OsuMethod hidl_osu_method = {}; 8409322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius if (osu_method & 0x1) { 8419322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_osu_method = 8429322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius ISupplicantStaIfaceCallback::OsuMethod::OMA_DM; 8439322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius } else if (osu_method & 0x2) { 8449322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius hidl_osu_method = 8459322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius ISupplicantStaIfaceCallback::OsuMethod::SOAP_XML_SPP; 8469322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius } 8479322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius callWithEachStaIfaceCallback( 8489322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius wpa_s->ifname, 8499322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius std::bind( 8509322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius &ISupplicantStaIfaceCallback::onHs20SubscriptionRemediation, 85116df495ccd197921e6cc88094cf0e1ff908b0105Roshan Pius std::placeholders::_1, wpa_s->bssid, hidl_osu_method, url)); 8529322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius} 8539322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 8549322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius/** 8559322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * Notify all listeners about the reception of HS20 immient deauth 8569322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * notification from the server. 8579322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * 8589322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface. 8599322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param code Deauth reason code sent from server. 8609322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param reauth_delay Reauthentication delay in seconds sent from server. 8619322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius * @param url URL of the server. 8629322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius */ 8639322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Piusvoid HidlManager::notifyHs20RxDeauthImminentNotice( 8649322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius struct wpa_supplicant *wpa_s, u8 code, u16 reauth_delay, const char *url) 8659322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius{ 8669322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius if (!wpa_s || !url) 8679322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius return; 8689322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 869fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 870fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 8719322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius return; 8729322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 8739322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius callWithEachStaIfaceCallback( 8749322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius wpa_s->ifname, 8759322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius std::bind( 8769322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius &ISupplicantStaIfaceCallback::onHs20DeauthImminentNotice, 87716df495ccd197921e6cc88094cf0e1ff908b0105Roshan Pius std::placeholders::_1, wpa_s->bssid, code, reauth_delay, url)); 8789322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius} 8799322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius 8809322a34c4f97d96c1c42c5fbb53fb3d4fba933d6Roshan Pius/** 8810974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * Notify all listeners about the reason code for disconnection from the 8820974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * currently connected network. 8830974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * 8840974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface on which 8850974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * the network is present. 8860974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius */ 8870974e961cd7bac71cf4d5919551e84541abf2b38Roshan Piusvoid HidlManager::notifyDisconnectReason(struct wpa_supplicant *wpa_s) 8880974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius{ 8890974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius if (!wpa_s) 8900974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius return; 8910974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius 892fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 893fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 8940974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius return; 8950974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius 8960974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius const u8 *bssid = wpa_s->bssid; 8970974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius if (is_zero_ether_addr(bssid)) { 8980974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius bssid = wpa_s->pending_bssid; 8990974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius } 9000974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius 9010974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius callWithEachStaIfaceCallback( 9020974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius wpa_s->ifname, 9030974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius std::bind( 9040974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius &ISupplicantStaIfaceCallback::onDisconnected, 905fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, bssid, wpa_s->disconnect_reason < 0, 9061ae7e6afc2787a108170909e37b24c6e9c128795Roshan Pius static_cast<ISupplicantStaIfaceCallback::ReasonCode>( 9071ae7e6afc2787a108170909e37b24c6e9c128795Roshan Pius wpa_s->disconnect_reason))); 9080974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius} 9090974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius 9100974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius/** 9110974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * Notify all listeners about association reject from the access point to which 9120974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * we are attempting to connect. 9130974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * 9140974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * @param wpa_s |wpa_supplicant| struct corresponding to the interface on which 9150974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius * the network is present. 9160974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius */ 9170974e961cd7bac71cf4d5919551e84541abf2b38Roshan Piusvoid HidlManager::notifyAssocReject(struct wpa_supplicant *wpa_s) 9180974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius{ 9190974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius if (!wpa_s) 9200974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius return; 9210974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius 922fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 923fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 9240974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius return; 9250974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius 9260974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius const u8 *bssid = wpa_s->bssid; 9270974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius if (is_zero_ether_addr(bssid)) { 9280974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius bssid = wpa_s->pending_bssid; 9290974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius } 9300974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius 9310974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius callWithEachStaIfaceCallback( 9320974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius wpa_s->ifname, 9330974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius std::bind( 9340974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius &ISupplicantStaIfaceCallback::onAssociationRejected, 9351ae7e6afc2787a108170909e37b24c6e9c128795Roshan Pius std::placeholders::_1, bssid, 9361ae7e6afc2787a108170909e37b24c6e9c128795Roshan Pius static_cast<ISupplicantStaIfaceCallback::StatusCode>( 9371ae7e6afc2787a108170909e37b24c6e9c128795Roshan Pius wpa_s->assoc_status_code), 938807bc58f434d07965509d3d491dafd07c4431a55Roshan Pius wpa_s->assoc_timed_out == 1)); 9390974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius} 9400974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius 94138e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Piusvoid HidlManager::notifyAuthTimeout(struct wpa_supplicant *wpa_s) 94238e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius{ 94338e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius if (!wpa_s) 94438e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius return; 94538e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius 94638e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius const std::string ifname(wpa_s->ifname); 94738e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius if (sta_iface_object_map_.find(ifname) == sta_iface_object_map_.end()) 94838e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius return; 94938e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius 95038e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius const u8 *bssid = wpa_s->bssid; 95138e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius if (is_zero_ether_addr(bssid)) { 95238e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius bssid = wpa_s->pending_bssid; 95338e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius } 95438e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius callWithEachStaIfaceCallback( 95538e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius wpa_s->ifname, 95638e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius std::bind( 95738e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius &ISupplicantStaIfaceCallback::onAuthenticationTimeout, 958e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius std::placeholders::_1, bssid)); 959e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius} 960e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius 961e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Piusvoid HidlManager::notifyBssidChanged(struct wpa_supplicant *wpa_s) 962e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius{ 963e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius if (!wpa_s) 964e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius return; 965e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius 966e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius const std::string ifname(wpa_s->ifname); 967e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius if (sta_iface_object_map_.find(ifname) == sta_iface_object_map_.end()) 968e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius return; 969e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius 970e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius // wpa_supplicant does not explicitly give us the reason for bssid 971e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius // change, but we figure that out from what is set out of |wpa_s->bssid| 972e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius // & |wpa_s->pending_bssid|. 973e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius const u8 *bssid; 974e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius ISupplicantStaIfaceCallback::BssidChangeReason reason; 975e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius if (is_zero_ether_addr(wpa_s->bssid) && 976e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius !is_zero_ether_addr(wpa_s->pending_bssid)) { 977e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius bssid = wpa_s->pending_bssid; 978e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius reason = 979e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius ISupplicantStaIfaceCallback::BssidChangeReason::ASSOC_START; 980e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius } else if ( 981e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius !is_zero_ether_addr(wpa_s->bssid) && 982e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius is_zero_ether_addr(wpa_s->pending_bssid)) { 983e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius bssid = wpa_s->bssid; 984e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius reason = ISupplicantStaIfaceCallback::BssidChangeReason:: 985e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius ASSOC_COMPLETE; 986e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius } else if ( 987e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius is_zero_ether_addr(wpa_s->bssid) && 988e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius is_zero_ether_addr(wpa_s->pending_bssid)) { 989e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius bssid = wpa_s->pending_bssid; 990e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius reason = 991e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius ISupplicantStaIfaceCallback::BssidChangeReason::DISASSOC; 992e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius } else { 993e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius wpa_printf(MSG_ERROR, "Unknown bssid change reason"); 994e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius return; 995e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius } 996e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius 997e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius callWithEachStaIfaceCallback( 998e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius wpa_s->ifname, std::bind( 999e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius &ISupplicantStaIfaceCallback::onBssidChanged, 1000e746d6b596b0a6fb06129350a0a674a901ae3964Roshan Pius std::placeholders::_1, reason, bssid)); 100138e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius} 100238e96765e08839e3f5812ea4d6ef30121ab9e63eRoshan Pius 1003149327590e009d96301e69772e717e227215d5acRoshan Piusvoid HidlManager::notifyWpsEventFail( 1004149327590e009d96301e69772e717e227215d5acRoshan Pius struct wpa_supplicant *wpa_s, uint8_t *peer_macaddr, uint16_t config_error, 1005149327590e009d96301e69772e717e227215d5acRoshan Pius uint16_t error_indication) 1006149327590e009d96301e69772e717e227215d5acRoshan Pius{ 1007149327590e009d96301e69772e717e227215d5acRoshan Pius if (!wpa_s || !peer_macaddr) 1008149327590e009d96301e69772e717e227215d5acRoshan Pius return; 1009149327590e009d96301e69772e717e227215d5acRoshan Pius 1010fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 1011fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 1012149327590e009d96301e69772e717e227215d5acRoshan Pius return; 1013149327590e009d96301e69772e717e227215d5acRoshan Pius 1014149327590e009d96301e69772e717e227215d5acRoshan Pius callWithEachStaIfaceCallback( 1015fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1016fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1017fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantStaIfaceCallback::onWpsEventFail, 1018fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, peer_macaddr, 1019fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius static_cast<ISupplicantStaIfaceCallback::WpsConfigError>( 1020fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius config_error), 1021fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius static_cast<ISupplicantStaIfaceCallback::WpsErrorIndication>( 1022fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius error_indication))); 1023149327590e009d96301e69772e717e227215d5acRoshan Pius} 1024149327590e009d96301e69772e717e227215d5acRoshan Pius 1025149327590e009d96301e69772e717e227215d5acRoshan Piusvoid HidlManager::notifyWpsEventSuccess(struct wpa_supplicant *wpa_s) 1026149327590e009d96301e69772e717e227215d5acRoshan Pius{ 1027149327590e009d96301e69772e717e227215d5acRoshan Pius if (!wpa_s) 1028149327590e009d96301e69772e717e227215d5acRoshan Pius return; 1029149327590e009d96301e69772e717e227215d5acRoshan Pius 1030fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 1031fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 1032149327590e009d96301e69772e717e227215d5acRoshan Pius return; 1033149327590e009d96301e69772e717e227215d5acRoshan Pius 1034149327590e009d96301e69772e717e227215d5acRoshan Pius callWithEachStaIfaceCallback( 1035149327590e009d96301e69772e717e227215d5acRoshan Pius wpa_s->ifname, std::bind( 1036149327590e009d96301e69772e717e227215d5acRoshan Pius &ISupplicantStaIfaceCallback::onWpsEventSuccess, 1037149327590e009d96301e69772e717e227215d5acRoshan Pius std::placeholders::_1)); 1038149327590e009d96301e69772e717e227215d5acRoshan Pius} 1039149327590e009d96301e69772e717e227215d5acRoshan Pius 1040149327590e009d96301e69772e717e227215d5acRoshan Piusvoid HidlManager::notifyWpsEventPbcOverlap(struct wpa_supplicant *wpa_s) 1041149327590e009d96301e69772e717e227215d5acRoshan Pius{ 1042149327590e009d96301e69772e717e227215d5acRoshan Pius if (!wpa_s) 1043149327590e009d96301e69772e717e227215d5acRoshan Pius return; 1044149327590e009d96301e69772e717e227215d5acRoshan Pius 1045fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 1046fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 1047149327590e009d96301e69772e717e227215d5acRoshan Pius return; 1048149327590e009d96301e69772e717e227215d5acRoshan Pius 1049149327590e009d96301e69772e717e227215d5acRoshan Pius callWithEachStaIfaceCallback( 10506a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius wpa_s->ifname, 10516a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius std::bind( 10526a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius &ISupplicantStaIfaceCallback::onWpsEventPbcOverlap, 10536a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius std::placeholders::_1)); 1054149327590e009d96301e69772e717e227215d5acRoshan Pius} 1055149327590e009d96301e69772e717e227215d5acRoshan Pius 1056fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pDeviceFound( 1057fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const u8 *addr, 1058fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius const struct p2p_peer_info *info, const u8 *peer_wfd_device_info, 1059fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius u8 peer_wfd_device_info_len) 1060fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 106173d28fd8e60d757c8f648bae6f884fc799a077c1Roshan Pius if (!wpa_s || !addr || !info) 1062fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1063fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1064fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1065fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1066fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1067fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 106873d28fd8e60d757c8f648bae6f884fc799a077c1Roshan Pius std::array<uint8_t, kWfdDeviceInfoLen> hidl_peer_wfd_device_info{}; 106973d28fd8e60d757c8f648bae6f884fc799a077c1Roshan Pius if (peer_wfd_device_info) { 107073d28fd8e60d757c8f648bae6f884fc799a077c1Roshan Pius if (peer_wfd_device_info_len != kWfdDeviceInfoLen) { 107173d28fd8e60d757c8f648bae6f884fc799a077c1Roshan Pius wpa_printf( 107273d28fd8e60d757c8f648bae6f884fc799a077c1Roshan Pius MSG_ERROR, "Unexpected WFD device info len: %d", 107373d28fd8e60d757c8f648bae6f884fc799a077c1Roshan Pius peer_wfd_device_info_len); 107473d28fd8e60d757c8f648bae6f884fc799a077c1Roshan Pius } else { 107573d28fd8e60d757c8f648bae6f884fc799a077c1Roshan Pius os_memcpy( 107673d28fd8e60d757c8f648bae6f884fc799a077c1Roshan Pius hidl_peer_wfd_device_info.data(), 107773d28fd8e60d757c8f648bae6f884fc799a077c1Roshan Pius peer_wfd_device_info, kWfdDeviceInfoLen); 107873d28fd8e60d757c8f648bae6f884fc799a077c1Roshan Pius } 1079fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius } 1080fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1081fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1082fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1083fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1084fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onDeviceFound, 1085fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, addr, info->p2p_device_addr, 1086fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius info->pri_dev_type, info->device_name, info->config_methods, 108773d28fd8e60d757c8f648bae6f884fc799a077c1Roshan Pius info->dev_capab, info->group_capab, hidl_peer_wfd_device_info)); 1088fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1089fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1090fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pDeviceLost( 1091fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const u8 *p2p_device_addr) 1092fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1093fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !p2p_device_addr) 1094fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1095fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1096fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1097fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1098fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1099fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1100fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1101fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, std::bind( 1102fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onDeviceLost, 1103fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, p2p_device_addr)); 1104fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1105fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1106fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pFindStopped(struct wpa_supplicant *wpa_s) 1107fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1108fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s) 1109fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1110fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1111fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1112fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1113fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1114fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1115fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1116fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, std::bind( 1117fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onFindStopped, 1118fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1)); 1119fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1120fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1121fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pGoNegReq( 1122fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const u8 *src_addr, u16 dev_passwd_id, 1123fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius u8 /* go_intent */) 1124fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1125fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !src_addr) 1126fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1127fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1128fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1129fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1130fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1131fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1132fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1133fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1134fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1135fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onGoNegotiationRequest, 1136fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, src_addr, 1137fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius static_cast<ISupplicantP2pIfaceCallback::WpsDevPasswordId>( 1138fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius dev_passwd_id))); 1139fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1140fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1141fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pGoNegCompleted( 1142fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const struct p2p_go_neg_results *res) 1143fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1144fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !res) 1145fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1146fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1147fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1148fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1149fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1150fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1151fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1152fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1153fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1154fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onGoNegotiationCompleted, 1155fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, 1156fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius static_cast<ISupplicantP2pIfaceCallback::P2pStatusCode>( 1157fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius res->status))); 1158fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1159fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1160fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pGroupFormationFailure( 1161fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const char *reason) 1162fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1163fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !reason) 1164fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1165fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1166fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1167fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1168fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1169fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1170fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1171fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1172fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1173fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onGroupFormationFailure, 1174fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, reason)); 1175fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1176fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1177fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pGroupStarted( 11787a1c8485ae3a467debc89ca8477cf6f4b4217f21Roshan Pius struct wpa_supplicant *wpa_group_s, const struct wpa_ssid *ssid, int persistent, int client) 1179fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 11807a1c8485ae3a467debc89ca8477cf6f4b4217f21Roshan Pius if (!wpa_group_s || !wpa_group_s->parent || !ssid) 1181fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1182fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1183fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius // For group notifications, need to use the parent iface for callbacks. 1184fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s = wpa_group_s->parent; 1185fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1186fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1187fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1188fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1189fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius uint32_t hidl_freq = wpa_group_s->current_bss 1190fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius ? wpa_group_s->current_bss->freq 1191fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius : wpa_group_s->assoc_freq; 1192fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::array<uint8_t, 32> hidl_psk; 1193fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (ssid->psk_set) { 1194fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius os_memcpy(hidl_psk.data(), ssid->psk, 32); 1195fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius } 1196fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius bool hidl_is_go = (client == 0 ? true : false); 1197fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius bool hidl_is_persistent = (persistent == 1 ? true : false); 1198fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1199fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1200fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1201fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1202fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onGroupStarted, 1203fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, wpa_group_s->ifname, hidl_is_go, 1204fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::vector<uint8_t>{ssid->ssid, ssid->ssid + ssid->ssid_len}, 1205fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius hidl_freq, hidl_psk, ssid->passphrase, wpa_group_s->go_dev_addr, 1206fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius hidl_is_persistent)); 1207fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1208fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1209fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pGroupRemoved( 1210fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_group_s, const struct wpa_ssid *ssid, 1211fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius const char *role) 1212fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1213fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_group_s || !wpa_group_s->parent || !ssid || !role) 1214fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1215fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1216fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius // For group notifications, need to use the parent iface for callbacks. 1217fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s = wpa_group_s->parent; 1218fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1219fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1220fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1221fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1222fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius bool hidl_is_go = (std::string(role) == "GO"); 1223fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1224fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1225fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1226fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1227fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onGroupRemoved, 1228fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, wpa_group_s->ifname, hidl_is_go)); 1229fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1230fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1231fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pInvitationReceived( 1232fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const u8 *sa, const u8 *go_dev_addr, 1233fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius const u8 *bssid, int id, int op_freq) 1234fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1235fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !sa || !go_dev_addr || !bssid) 1236fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1237fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1238fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1239fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1240fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1241fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1242fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius SupplicantNetworkId hidl_network_id; 1243fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (id < 0) { 1244fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius hidl_network_id = UINT32_MAX; 1245fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius } 1246fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius hidl_network_id = id; 1247fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1248fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1249fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1250fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1251fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onInvitationReceived, 1252fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, sa, go_dev_addr, bssid, hidl_network_id, 1253fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius op_freq)); 1254fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1255fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1256fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pInvitationResult( 1257fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, int status, const u8 *bssid) 1258fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1259fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !bssid) 1260fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1261fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1262fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1263fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1264fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1265fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1266fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1267fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1268fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1269fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onInvitationResult, 1270fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, bssid, 1271fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius static_cast<ISupplicantP2pIfaceCallback::P2pStatusCode>( 1272fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius status))); 1273fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1274fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1275fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pProvisionDiscovery( 1276fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const u8 *dev_addr, int request, 1277fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius enum p2p_prov_disc_status status, u16 config_methods, 1278fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius unsigned int generated_pin) 1279fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1280fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !dev_addr) 1281fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1282fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1283fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1284fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1285fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1286fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1287fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::string hidl_generated_pin; 1288fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (generated_pin > 0) { 1289235f7da827f7236c90f837b5604a026d3f61b8a1Roshan Pius hidl_generated_pin = 1290235f7da827f7236c90f837b5604a026d3f61b8a1Roshan Pius misc_utils::convertWpsPinToString(generated_pin); 1291fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius } 1292fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius bool hidl_is_request = (request == 1 ? true : false); 1293fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1294fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1295fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1296fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1297fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onProvisionDiscoveryCompleted, 1298fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, dev_addr, hidl_is_request, 1299fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius static_cast<ISupplicantP2pIfaceCallback::P2pProvDiscStatusCode>( 1300fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius status), 1301fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius config_methods, hidl_generated_pin)); 1302fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1303fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1304fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyP2pSdResponse( 1305fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const u8 *sa, u16 update_indic, 1306fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius const u8 *tlvs, size_t tlvs_len) 1307fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1308fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (!wpa_s || !sa || !tlvs) 1309fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1310fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1311fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (p2p_iface_object_map_.find(wpa_s->ifname) == 1312fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1313fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1314fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1315fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 1316fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius wpa_s->ifname, 1317fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::bind( 1318fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onServiceDiscoveryResponse, 1319fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::placeholders::_1, sa, update_indic, 1320fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius std::vector<uint8_t>{tlvs, tlvs + tlvs_len})); 1321fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1322fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1323fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyApStaAuthorized( 1324fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const u8 *sta, const u8 *p2p_dev_addr) 1325fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1326b3758b2e318490b67422bf8a2256d6cf6534b41bGlen Kuhne if (!wpa_s || !wpa_s->parent || !sta) 1327fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 132830990d649c75c4f6fc9ae1c30ab17cf8c729d2acGlen Kuhne if (p2p_iface_object_map_.find(wpa_s->parent->ifname) == 1329fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1330fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1331fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 133230990d649c75c4f6fc9ae1c30ab17cf8c729d2acGlen Kuhne wpa_s->parent->ifname, std::bind( 1333fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onStaAuthorized, 1334b3758b2e318490b67422bf8a2256d6cf6534b41bGlen Kuhne std::placeholders::_1, sta, p2p_dev_addr ? p2p_dev_addr : kZeroBssid)); 1335fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1336fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1337fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Piusvoid HidlManager::notifyApStaDeauthorized( 1338fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius struct wpa_supplicant *wpa_s, const u8 *sta, const u8 *p2p_dev_addr) 1339fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius{ 1340b3758b2e318490b67422bf8a2256d6cf6534b41bGlen Kuhne if (!wpa_s || !wpa_s->parent || !sta) 1341fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 134230990d649c75c4f6fc9ae1c30ab17cf8c729d2acGlen Kuhne if (p2p_iface_object_map_.find(wpa_s->parent->ifname) == 1343fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius p2p_iface_object_map_.end()) 1344fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius return; 1345fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 1346fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius callWithEachP2pIfaceCallback( 134730990d649c75c4f6fc9ae1c30ab17cf8c729d2acGlen Kuhne wpa_s->parent->ifname, std::bind( 1348fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius &ISupplicantP2pIfaceCallback::onStaDeauthorized, 1349b3758b2e318490b67422bf8a2256d6cf6534b41bGlen Kuhne std::placeholders::_1, sta, p2p_dev_addr ? p2p_dev_addr : kZeroBssid)); 1350fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius} 1351fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius 135294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piusvoid HidlManager::notifyExtRadioWorkStart( 135394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius struct wpa_supplicant *wpa_s, uint32_t id) 135494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{ 135594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius if (!wpa_s) 135694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius return; 135794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 1358fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 1359fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 136094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius return; 136194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 136294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius callWithEachStaIfaceCallback( 136394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius wpa_s->ifname, 136494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius std::bind( 136594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius &ISupplicantStaIfaceCallback::onExtRadioWorkStart, 136694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius std::placeholders::_1, id)); 136794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius} 136894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 136994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piusvoid HidlManager::notifyExtRadioWorkTimeout( 137094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius struct wpa_supplicant *wpa_s, uint32_t id) 137194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{ 137294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius if (!wpa_s) 137394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius return; 137494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 1375fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius if (sta_iface_object_map_.find(wpa_s->ifname) == 1376fd2fd66037872fa3b6adcd2a72adc66dda5912caRoshan Pius sta_iface_object_map_.end()) 137794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius return; 137894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 137994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius callWithEachStaIfaceCallback( 138094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius wpa_s->ifname, 138194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius std::bind( 138294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius &ISupplicantStaIfaceCallback::onExtRadioWorkTimeout, 138394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius std::placeholders::_1, id)); 138494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius} 138594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 13860974e961cd7bac71cf4d5919551e84541abf2b38Roshan Pius/** 1387ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Retrieve the |ISupplicantP2pIface| hidl object reference using the provided 1388ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * ifname. 1389ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1390ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param ifname Name of the corresponding interface. 1391ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param iface_object Hidl reference corresponding to the iface. 1392ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1393ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @return 0 on success, 1 on failure. 1394ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius */ 1395ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint HidlManager::getP2pIfaceHidlObjectByIfname( 1396ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, android::sp<ISupplicantP2pIface> *iface_object) 1397ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 1398ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (ifname.empty() || !iface_object) 1399ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 1400ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 1401ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto iface_object_iter = p2p_iface_object_map_.find(ifname); 1402ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (iface_object_iter == p2p_iface_object_map_.end()) 1403ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 1404ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 1405ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius *iface_object = iface_object_iter->second; 1406ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 0; 1407ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 1408ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 1409ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius/** 1410ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Retrieve the |ISupplicantStaIface| hidl object reference using the provided 14118e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * ifname. 141232c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * 141332c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * @param ifname Name of the corresponding interface. 141457ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * @param iface_object Hidl reference corresponding to the iface. 141532c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * 141632c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius * @return 0 on success, 1 on failure. 141732c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius */ 1418ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint HidlManager::getStaIfaceHidlObjectByIfname( 1419ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, android::sp<ISupplicantStaIface> *iface_object) 1420e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt{ 142132c15e2ef4170f3b82d90b69c52c28351ca4cf0aRoshan Pius if (ifname.empty() || !iface_object) 1422e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return 1; 1423e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 1424ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto iface_object_iter = sta_iface_object_map_.find(ifname); 1425ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (iface_object_iter == sta_iface_object_map_.end()) 1426e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return 1; 1427e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 14288e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius *iface_object = iface_object_iter->second; 1429e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return 0; 1430e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt} 1431e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 1432d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius/** 1433ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Retrieve the |ISupplicantP2pNetwork| hidl object reference using the provided 14348e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * ifname and network_id. 1435d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * 1436d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @param ifname Name of the corresponding interface. 1437d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @param network_id ID of the corresponding network. 143857ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * @param network_object Hidl reference corresponding to the network. 1439d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * 1440d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @return 0 on success, 1 on failure. 1441d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius */ 1442ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint HidlManager::getP2pNetworkHidlObjectByIfnameAndNetworkId( 1443d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius const std::string &ifname, int network_id, 1444ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius android::sp<ISupplicantP2pNetwork> *network_object) 1445d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius{ 1446d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius if (ifname.empty() || network_id < 0 || !network_object) 1447d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius return 1; 1448d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 1449d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius // Generate the key to be used to lookup the network. 1450d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius const std::string network_key = 1451d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius getNetworkObjectMapKey(ifname, network_id); 1452d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 1453ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto network_object_iter = p2p_network_object_map_.find(network_key); 1454ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (network_object_iter == p2p_network_object_map_.end()) 1455ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 1456ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 1457ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius *network_object = network_object_iter->second; 1458ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 0; 1459ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 1460ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 1461ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius/** 1462ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Retrieve the |ISupplicantStaNetwork| hidl object reference using the provided 1463ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * ifname and network_id. 1464ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1465ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param ifname Name of the corresponding interface. 1466ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param network_id ID of the corresponding network. 1467ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param network_object Hidl reference corresponding to the network. 1468ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1469ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @return 0 on success, 1 on failure. 1470ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius */ 1471ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint HidlManager::getStaNetworkHidlObjectByIfnameAndNetworkId( 1472ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, int network_id, 1473ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius android::sp<ISupplicantStaNetwork> *network_object) 1474ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 1475ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (ifname.empty() || network_id < 0 || !network_object) 1476ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return 1; 1477ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 1478ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius // Generate the key to be used to lookup the network. 1479ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string network_key = 1480ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius getNetworkObjectMapKey(ifname, network_id); 1481ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 1482ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius auto network_object_iter = sta_network_object_map_.find(network_key); 1483ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius if (network_object_iter == sta_network_object_map_.end()) 1484d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius return 1; 1485d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 14868e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius *network_object = network_object_iter->second; 1487d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius return 0; 1488d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius} 1489d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 1490d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius/** 149157ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * Add a new |ISupplicantCallback| hidl object reference to our 14920470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * global callback list. 14930470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * 149457ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * @param callback Hidl reference of the |ISupplicantCallback| object. 14950470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * 14960470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * @return 0 on success, 1 on failure. 14970470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius */ 149857ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusint HidlManager::addSupplicantCallbackHidlObject( 14997c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius const android::sp<ISupplicantCallback> &callback) 15000470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius{ 15018e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius // Register for death notification before we add it to our list. 150257ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius auto on_hidl_died_fctor = std::bind( 150357ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius &HidlManager::removeSupplicantCallbackHidlObject, this, 15048e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius std::placeholders::_1); 150557ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius return registerForDeathAndAddCallbackHidlObjectToList< 15067c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius ISupplicantCallback>( 150757ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius callback, on_hidl_died_fctor, supplicant_callbacks_); 15080470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius} 1509ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius 15100470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius/** 1511ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Add a new iface callback hidl object reference to our 15120470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * interface callback list. 15130470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * 15140470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * @param ifname Name of the corresponding interface. 1515ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param callback Hidl reference of the callback object. 15160470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * 15170470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * @return 0 on success, 1 on failure. 15180470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius */ 1519ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint HidlManager::addP2pIfaceCallbackHidlObject( 15200470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius const std::string &ifname, 1521ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantP2pIfaceCallback> &callback) 15220470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius{ 1523ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function<void( 1524ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantP2pIfaceCallback> &)> 1525ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius on_hidl_died_fctor = std::bind( 1526ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &HidlManager::removeP2pIfaceCallbackHidlObject, this, ifname, 1527ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::placeholders::_1); 1528ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return addIfaceCallbackHidlObjectToMap( 1529ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, callback, on_hidl_died_fctor, p2p_iface_callbacks_map_); 1530ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 15318e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius 1532ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius/** 1533ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Add a new iface callback hidl object reference to our 1534ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * interface callback list. 1535ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1536ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param ifname Name of the corresponding interface. 1537ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param callback Hidl reference of the callback object. 1538ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1539ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @return 0 on success, 1 on failure. 1540ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius */ 1541ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint HidlManager::addStaIfaceCallbackHidlObject( 1542ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, 1543ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantStaIfaceCallback> &callback) 1544ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 1545ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function<void( 1546ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantStaIfaceCallback> &)> 1547ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius on_hidl_died_fctor = std::bind( 1548ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &HidlManager::removeStaIfaceCallbackHidlObject, this, ifname, 1549ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius std::placeholders::_1); 1550ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return addIfaceCallbackHidlObjectToMap( 1551ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, callback, on_hidl_died_fctor, sta_iface_callbacks_map_); 15520470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius} 15530470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius 15540470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius/** 1555ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Add a new network callback hidl object reference to our network callback 1556ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * list. 15570470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * 15580470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * @param ifname Name of the corresponding interface. 15590470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * @param network_id ID of the corresponding network. 1560ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param callback Hidl reference of the callback object. 15610470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * 15620470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius * @return 0 on success, 1 on failure. 15630470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius */ 1564ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint HidlManager::addP2pNetworkCallbackHidlObject( 15650470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius const std::string &ifname, int network_id, 1566ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantP2pNetworkCallback> &callback) 15670470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius{ 1568ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function<void( 1569ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantP2pNetworkCallback> &)> 1570ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius on_hidl_died_fctor = std::bind( 1571ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &HidlManager::removeP2pNetworkCallbackHidlObject, this, ifname, 1572ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius network_id, std::placeholders::_1); 1573ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return addNetworkCallbackHidlObjectToMap( 1574ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, network_id, callback, on_hidl_died_fctor, 1575ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius p2p_network_callbacks_map_); 15760470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius} 15770470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius 15780470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius/** 1579ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Add a new network callback hidl object reference to our network callback 1580ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * list. 1581d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * 1582d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @param ifname Name of the corresponding interface. 1583d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius * @param network_id ID of the corresponding network. 1584ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param callback Hidl reference of the callback object. 1585ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1586ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @return 0 on success, 1 on failure. 1587d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius */ 1588ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusint HidlManager::addStaNetworkCallbackHidlObject( 1589ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, int network_id, 1590ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantStaNetworkCallback> &callback) 1591d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius{ 1592ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function<void( 1593ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantStaNetworkCallback> &)> 1594ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius on_hidl_died_fctor = std::bind( 1595ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &HidlManager::removeStaNetworkCallbackHidlObject, this, ifname, 1596ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius network_id, std::placeholders::_1); 1597ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return addNetworkCallbackHidlObjectToMap( 1598ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, network_id, callback, on_hidl_died_fctor, 1599ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius sta_network_callbacks_map_); 1600d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius} 16018e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius 16028e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius/** 160357ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * Removes the provided |ISupplicantCallback| hidl object reference 16048e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * from our global callback list. 16058e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * 160657ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * @param callback Hidl reference of the |ISupplicantCallback| object. 16078e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius */ 160857ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusvoid HidlManager::removeSupplicantCallbackHidlObject( 16097c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius const android::sp<ISupplicantCallback> &callback) 16108e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius{ 16118e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius supplicant_callbacks_.erase( 16128e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius std::remove( 16138e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius supplicant_callbacks_.begin(), supplicant_callbacks_.end(), 16148e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius callback), 16158e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius supplicant_callbacks_.end()); 16168e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius} 16178e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius 16188e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius/** 1619ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Removes the provided iface callback hidl object reference from 16208e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * our interface callback list. 16218e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * 16228e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * @param ifname Name of the corresponding interface. 1623ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param callback Hidl reference of the callback object. 16248e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius */ 1625ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid HidlManager::removeP2pIfaceCallbackHidlObject( 16268e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius const std::string &ifname, 1627ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantP2pIfaceCallback> &callback) 16288e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius{ 1629ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return removeIfaceCallbackHidlObjectFromMap( 1630ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, callback, p2p_iface_callbacks_map_); 1631ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 16328e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius 1633ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius/** 1634ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Removes the provided iface callback hidl object reference from 1635ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * our interface callback list. 1636ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1637ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param ifname Name of the corresponding interface. 1638ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param callback Hidl reference of the callback object. 1639ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius */ 1640ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid HidlManager::removeStaIfaceCallbackHidlObject( 1641ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, 1642ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantStaIfaceCallback> &callback) 1643ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 1644ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return removeIfaceCallbackHidlObjectFromMap( 1645ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, callback, sta_iface_callbacks_map_); 16468e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius} 16478e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius 16488e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius/** 1649ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Removes the provided network callback hidl object reference from 16508e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * our network callback list. 16518e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * 16528e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * @param ifname Name of the corresponding interface. 16538e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * @param network_id ID of the corresponding network. 1654ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param callback Hidl reference of the callback object. 16558e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius */ 1656ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid HidlManager::removeP2pNetworkCallbackHidlObject( 16578e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius const std::string &ifname, int network_id, 1658ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantP2pNetworkCallback> &callback) 16598e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius{ 1660ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return removeNetworkCallbackHidlObjectFromMap( 1661ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, network_id, callback, p2p_network_callbacks_map_); 16628e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius} 16638e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius 16648e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius/** 1665ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Removes the provided network callback hidl object reference from 1666ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * our network callback list. 16678e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius * 1668ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param ifname Name of the corresponding interface. 1669ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param network_id ID of the corresponding network. 1670ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param callback Hidl reference of the callback object. 16718e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius */ 1672ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid HidlManager::removeStaNetworkCallbackHidlObject( 1673ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, int network_id, 1674ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const android::sp<ISupplicantStaNetworkCallback> &callback) 16758e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius{ 1676ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius return removeNetworkCallbackHidlObjectFromMap( 1677ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, network_id, callback, sta_network_callbacks_map_); 16788e6e235ef7316fc63f8b603b2fcd348bccc0c7d8Roshan Pius} 16792d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius 16802d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius/** 16812d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * Helper function to invoke the provided callback method on all the 168257ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * registered |ISupplicantCallback| callback hidl objects. 16832d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * 168457ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * @param method Pointer to the required hidl method from 16852d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * |ISupplicantCallback|. 16862d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius */ 168757ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Piusvoid HidlManager::callWithEachSupplicantCallback( 16887c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius const std::function<Return<void>(android::sp<ISupplicantCallback>)> &method) 16892d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius{ 16902d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius for (const auto &callback : supplicant_callbacks_) { 1691cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius if (!method(callback).isOk()) { 1692cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius wpa_printf(MSG_ERROR, "Failed to invoke HIDL callback"); 1693cfb7d5e3997bb4355027453d9a1e0fd9fbc55637Roshan Pius } 16942d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius } 16952d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius} 16962d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius 16972d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius/** 16982d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * Helper fucntion to invoke the provided callback method on all the 1699ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * registered iface callback hidl objects for the specified 17002d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * |ifname|. 17012d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * 17022d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * @param ifname Name of the corresponding interface. 17037c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * @param method Pointer to the required hidl method from 17047c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * |ISupplicantIfaceCallback|. 17052d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius */ 1706ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid HidlManager::callWithEachP2pIfaceCallback( 17072d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius const std::string &ifname, 1708ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function<Return<void>(android::sp<ISupplicantP2pIfaceCallback>)> 17097c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius &method) 17102d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius{ 1711ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callWithEachIfaceCallback(ifname, method, p2p_iface_callbacks_map_); 1712ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 17132d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius 1714ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius/** 1715ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Helper fucntion to invoke the provided callback method on all the 1716ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * registered iface callback hidl objects for the specified 1717ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * |ifname|. 1718ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1719ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param ifname Name of the corresponding interface. 1720ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param method Pointer to the required hidl method from 1721ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * |ISupplicantIfaceCallback|. 1722ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius */ 1723ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid HidlManager::callWithEachStaIfaceCallback( 1724ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, 1725ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function<Return<void>(android::sp<ISupplicantStaIfaceCallback>)> 1726ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius &method) 1727ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 1728ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callWithEachIfaceCallback(ifname, method, sta_iface_callbacks_map_); 17292d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius} 17302d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius 17312d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius/** 17322d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * Helper function to invoke the provided callback method on all the 1733ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * registered network callback hidl objects for the specified 17342d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * |ifname| & |network_id|. 17352d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * 17362d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * @param ifname Name of the corresponding interface. 17372d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius * @param network_id ID of the corresponding network. 17387c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * @param method Pointer to the required hidl method from 1739ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * |ISupplicantP2pNetworkCallback| or |ISupplicantStaNetworkCallback| . 17402d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius */ 1741ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid HidlManager::callWithEachP2pNetworkCallback( 17422d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius const std::string &ifname, int network_id, 1743ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function< 1744ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius Return<void>(android::sp<ISupplicantP2pNetworkCallback>)> &method) 17452d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius{ 1746ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callWithEachNetworkCallback( 1747ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, network_id, method, p2p_network_callbacks_map_); 17482d3fd51c25f9b5a85a37f09165015facdac3de1bRoshan Pius} 17497c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 1750ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius/** 1751ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * Helper function to invoke the provided callback method on all the 1752ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * registered network callback hidl objects for the specified 1753ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * |ifname| & |network_id|. 1754ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * 1755ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param ifname Name of the corresponding interface. 1756ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param network_id ID of the corresponding network. 1757ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * @param method Pointer to the required hidl method from 1758ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius * |ISupplicantP2pNetworkCallback| or |ISupplicantStaNetworkCallback| . 1759ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius */ 1760ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Piusvoid HidlManager::callWithEachStaNetworkCallback( 1761ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::string &ifname, int network_id, 1762ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius const std::function< 1763ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius Return<void>(android::sp<ISupplicantStaNetworkCallback>)> &method) 1764ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius{ 1765ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius callWithEachNetworkCallback( 1766ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius ifname, network_id, method, sta_network_callbacks_map_); 1767ea2a5ee1b5ee6d6306a59c796ce27b977ff7b14eRoshan Pius} 17687c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace implementation 17697c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace V1_0 17707c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace wifi 17717c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace supplicant 17727c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace hardware 17737c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace android 1774