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