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