1 /*
2  * hidl interface for wpa_supplicant daemon
3  * Copyright (c) 2004-2016, Jouni Malinen <j@w1.fi>
4  * Copyright (c) 2004-2016, Roshan Pius <rpius@google.com>
5  *
6  * This software may be distributed under the terms of the BSD license.
7  * See README for more details.
8  */
9 
10 #include <hwbinder/IPCThreadState.h>
11 
12 #include <hidl/HidlTransportSupport.h>
13 #include "hidl_manager.h"
14 
15 extern "C"
16 {
17 #include "hidl.h"
18 #include "hidl_i.h"
19 #include "utils/common.h"
20 #include "utils/eloop.h"
21 #include "utils/includes.h"
22 #include "dpp.h"
23 }
24 
25 using android::hardware::configureRpcThreadpool;
26 using android::hardware::handleTransportPoll;
27 using android::hardware::setupTransportPolling;
28 using android::hardware::wifi::supplicant::V1_3::DppFailureCode;
29 using android::hardware::wifi::supplicant::V1_3::DppProgressCode;
30 using android::hardware::wifi::supplicant::V1_3::DppSuccessCode;
31 using android::hardware::wifi::supplicant::V1_4::implementation::HidlManager;
32 
33 static void wpas_hidl_notify_dpp_failure(struct wpa_supplicant *wpa_s, DppFailureCode code);
34 static void wpas_hidl_notify_dpp_progress(struct wpa_supplicant *wpa_s, DppProgressCode code);
35 static void wpas_hidl_notify_dpp_success(struct wpa_supplicant *wpa_s, DppSuccessCode code);
36 
wpas_hidl_sock_handler(int sock,void *,void *)37 void wpas_hidl_sock_handler(
38     int sock, void * /* eloop_ctx */, void * /* sock_ctx */)
39 {
40 	handleTransportPoll(sock);
41 }
42 
wpas_hidl_init(struct wpa_global * global)43 struct wpas_hidl_priv *wpas_hidl_init(struct wpa_global *global)
44 {
45 	struct wpas_hidl_priv *priv;
46 	HidlManager *hidl_manager;
47 
48 	priv = (wpas_hidl_priv *)os_zalloc(sizeof(*priv));
49 	if (!priv)
50 		return NULL;
51 	priv->global = global;
52 
53 	wpa_printf(MSG_DEBUG, "Initing hidl control");
54 
55 	configureRpcThreadpool(1, true /* callerWillJoin */);
56 	priv->hidl_fd = setupTransportPolling();
57 	if (priv->hidl_fd < 0)
58 		goto err;
59 
60 	wpa_printf(MSG_INFO, "Processing hidl events on FD %d", priv->hidl_fd);
61 	// Look for read events from the hidl socket in the eloop.
62 	if (eloop_register_read_sock(
63 		priv->hidl_fd, wpas_hidl_sock_handler, global, priv) < 0)
64 		goto err;
65 
66 	hidl_manager = HidlManager::getInstance();
67 	if (!hidl_manager)
68 		goto err;
69 	if (hidl_manager->registerHidlService(global)) {
70 		goto err;
71 	}
72 	// We may not need to store this hidl manager reference in the
73 	// global data strucure because we've made it a singleton class.
74 	priv->hidl_manager = (void *)hidl_manager;
75 
76 	return priv;
77 err:
78 	wpas_hidl_deinit(priv);
79 	return NULL;
80 }
81 
wpas_hidl_deinit(struct wpas_hidl_priv * priv)82 void wpas_hidl_deinit(struct wpas_hidl_priv *priv)
83 {
84 	if (!priv)
85 		return;
86 
87 	wpa_printf(MSG_DEBUG, "Deiniting hidl control");
88 
89 	HidlManager::destroyInstance();
90 	eloop_unregister_read_sock(priv->hidl_fd);
91 	os_free(priv);
92 }
93 
wpas_hidl_register_interface(struct wpa_supplicant * wpa_s)94 int wpas_hidl_register_interface(struct wpa_supplicant *wpa_s)
95 {
96 	if (!wpa_s || !wpa_s->global->hidl)
97 		return 1;
98 
99 	wpa_printf(
100 	    MSG_DEBUG, "Registering interface to hidl control: %s",
101 	    wpa_s->ifname);
102 
103 	HidlManager *hidl_manager = HidlManager::getInstance();
104 	if (!hidl_manager)
105 		return 1;
106 
107 	return hidl_manager->registerInterface(wpa_s);
108 }
109 
wpas_hidl_unregister_interface(struct wpa_supplicant * wpa_s)110 int wpas_hidl_unregister_interface(struct wpa_supplicant *wpa_s)
111 {
112 	if (!wpa_s || !wpa_s->global->hidl)
113 		return 1;
114 
115 	wpa_printf(
116 	    MSG_DEBUG, "Deregistering interface from hidl control: %s",
117 	    wpa_s->ifname);
118 
119 	HidlManager *hidl_manager = HidlManager::getInstance();
120 	if (!hidl_manager)
121 		return 1;
122 
123 	return hidl_manager->unregisterInterface(wpa_s);
124 }
125 
wpas_hidl_register_network(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)126 int wpas_hidl_register_network(
127     struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
128 {
129 	if (!wpa_s || !wpa_s->global->hidl || !ssid)
130 		return 1;
131 
132 	wpa_printf(
133 	    MSG_DEBUG, "Registering network to hidl control: %d", ssid->id);
134 
135 	HidlManager *hidl_manager = HidlManager::getInstance();
136 	if (!hidl_manager)
137 		return 1;
138 
139 	return hidl_manager->registerNetwork(wpa_s, ssid);
140 }
141 
wpas_hidl_unregister_network(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)142 int wpas_hidl_unregister_network(
143     struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
144 {
145 	if (!wpa_s || !wpa_s->global->hidl || !ssid)
146 		return 1;
147 
148 	wpa_printf(
149 	    MSG_DEBUG, "Deregistering network from hidl control: %d", ssid->id);
150 
151 	HidlManager *hidl_manager = HidlManager::getInstance();
152 	if (!hidl_manager)
153 		return 1;
154 
155 	return hidl_manager->unregisterNetwork(wpa_s, ssid);
156 }
157 
wpas_hidl_notify_state_changed(struct wpa_supplicant * wpa_s)158 int wpas_hidl_notify_state_changed(struct wpa_supplicant *wpa_s)
159 {
160 	if (!wpa_s || !wpa_s->global->hidl)
161 		return 1;
162 
163 	wpa_printf(
164 	    MSG_DEBUG, "Notifying state change event to hidl control: %d",
165 	    wpa_s->wpa_state);
166 
167 	HidlManager *hidl_manager = HidlManager::getInstance();
168 	if (!hidl_manager)
169 		return 1;
170 
171 	return hidl_manager->notifyStateChange(wpa_s);
172 }
173 
wpas_hidl_notify_network_request(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid,enum wpa_ctrl_req_type rtype,const char * default_txt)174 int wpas_hidl_notify_network_request(
175     struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
176     enum wpa_ctrl_req_type rtype, const char *default_txt)
177 {
178 	if (!wpa_s || !wpa_s->global->hidl || !ssid)
179 		return 1;
180 
181 	wpa_printf(
182 	    MSG_DEBUG, "Notifying network request to hidl control: %d",
183 	    ssid->id);
184 
185 	HidlManager *hidl_manager = HidlManager::getInstance();
186 	if (!hidl_manager)
187 		return 1;
188 
189 	return hidl_manager->notifyNetworkRequest(
190 	    wpa_s, ssid, rtype, default_txt);
191 }
192 
wpas_hidl_notify_anqp_query_done(struct wpa_supplicant * wpa_s,const u8 * bssid,const char * result,const struct wpa_bss_anqp * anqp)193 void wpas_hidl_notify_anqp_query_done(
194     struct wpa_supplicant *wpa_s, const u8 *bssid, const char *result,
195     const struct wpa_bss_anqp *anqp)
196 {
197 	if (!wpa_s || !wpa_s->global->hidl || !bssid || !result || !anqp)
198 		return;
199 
200 	wpa_printf(
201 	    MSG_DEBUG,
202 	    "Notifying ANQP query done to hidl control: " MACSTR "result: %s",
203 	    MAC2STR(bssid), result);
204 
205 	HidlManager *hidl_manager = HidlManager::getInstance();
206 	if (!hidl_manager)
207 		return;
208 
209 	hidl_manager->notifyAnqpQueryDone(wpa_s, bssid, result, anqp);
210 }
211 
wpas_hidl_notify_hs20_icon_query_done(struct wpa_supplicant * wpa_s,const u8 * bssid,const char * file_name,const u8 * image,u32 image_length)212 void wpas_hidl_notify_hs20_icon_query_done(
213     struct wpa_supplicant *wpa_s, const u8 *bssid, const char *file_name,
214     const u8 *image, u32 image_length)
215 {
216 	if (!wpa_s || !wpa_s->global->hidl || !bssid || !file_name || !image)
217 		return;
218 
219 	wpa_printf(
220 	    MSG_DEBUG,
221 	    "Notifying HS20 icon query done to hidl control: " MACSTR
222 	    "file_name: %s",
223 	    MAC2STR(bssid), file_name);
224 
225 	HidlManager *hidl_manager = HidlManager::getInstance();
226 	if (!hidl_manager)
227 		return;
228 
229 	hidl_manager->notifyHs20IconQueryDone(
230 	    wpa_s, bssid, file_name, image, image_length);
231 }
232 
wpas_hidl_notify_hs20_rx_subscription_remediation(struct wpa_supplicant * wpa_s,const char * url,u8 osu_method)233 void wpas_hidl_notify_hs20_rx_subscription_remediation(
234     struct wpa_supplicant *wpa_s, const char *url, u8 osu_method)
235 {
236 	if (!wpa_s || !wpa_s->global->hidl || !url)
237 		return;
238 
239 	wpa_printf(
240 	    MSG_DEBUG,
241 	    "Notifying HS20 subscription remediation rx to hidl control: %s",
242 	    url);
243 
244 	HidlManager *hidl_manager = HidlManager::getInstance();
245 	if (!hidl_manager)
246 		return;
247 
248 	hidl_manager->notifyHs20RxSubscriptionRemediation(
249 	    wpa_s, url, osu_method);
250 }
251 
wpas_hidl_notify_hs20_rx_deauth_imminent_notice(struct wpa_supplicant * wpa_s,u8 code,u16 reauth_delay,const char * url)252 void wpas_hidl_notify_hs20_rx_deauth_imminent_notice(
253     struct wpa_supplicant *wpa_s, u8 code, u16 reauth_delay, const char *url)
254 {
255 	if (!wpa_s || !wpa_s->global->hidl)
256 		return;
257 
258 	wpa_printf(
259 	    MSG_DEBUG,
260 	    "Notifying HS20 deauth imminent notice rx to hidl control: %s",
261 	    url ? url : "<no URL>");
262 
263 	HidlManager *hidl_manager = HidlManager::getInstance();
264 	if (!hidl_manager)
265 		return;
266 
267 	hidl_manager->notifyHs20RxDeauthImminentNotice(
268 	    wpa_s, code, reauth_delay, url);
269 }
270 
wpas_hidl_notify_hs20_rx_terms_and_conditions_acceptance(struct wpa_supplicant * wpa_s,const char * url)271 void wpas_hidl_notify_hs20_rx_terms_and_conditions_acceptance(
272 		struct wpa_supplicant *wpa_s, const char *url)
273 {
274 	if (!wpa_s || !wpa_s->global->hidl || !url)
275 		return;
276 
277 	wpa_printf(MSG_DEBUG,
278 			"Notifying HS20 terms and conditions acceptance rx to hidl control: %s",
279 			url);
280 
281 	HidlManager *hidl_manager = HidlManager::getInstance();
282 	if (!hidl_manager)
283 		return;
284 
285 	hidl_manager->notifyHs20RxTermsAndConditionsAcceptance(wpa_s, url);
286 }
287 
wpas_hidl_notify_disconnect_reason(struct wpa_supplicant * wpa_s)288 void wpas_hidl_notify_disconnect_reason(struct wpa_supplicant *wpa_s)
289 {
290 	if (!wpa_s)
291 		return;
292 
293 	wpa_printf(
294 	    MSG_DEBUG, "Notifying disconnect reason to hidl control: %d",
295 	    wpa_s->disconnect_reason);
296 
297 	HidlManager *hidl_manager = HidlManager::getInstance();
298 	if (!hidl_manager)
299 		return;
300 
301 	hidl_manager->notifyDisconnectReason(wpa_s);
302 }
303 
wpas_hidl_notify_assoc_reject(struct wpa_supplicant * wpa_s,const u8 * bssid,u8 timed_out,const u8 * assoc_resp_ie,size_t assoc_resp_ie_len)304 void wpas_hidl_notify_assoc_reject(struct wpa_supplicant *wpa_s,
305     const u8 *bssid, u8 timed_out, const u8 *assoc_resp_ie, size_t assoc_resp_ie_len)
306 {
307 	if (!wpa_s)
308 		return;
309 
310 	wpa_printf(
311 	    MSG_DEBUG, "Notifying assoc reject to hidl control: %d",
312 	    wpa_s->assoc_status_code);
313 
314 	HidlManager *hidl_manager = HidlManager::getInstance();
315 	if (!hidl_manager)
316 		return;
317 
318 	hidl_manager->notifyAssocReject(wpa_s, bssid, timed_out, assoc_resp_ie, assoc_resp_ie_len);
319 }
320 
wpas_hidl_notify_auth_timeout(struct wpa_supplicant * wpa_s)321 void wpas_hidl_notify_auth_timeout(struct wpa_supplicant *wpa_s)
322 {
323 	if (!wpa_s)
324 		return;
325 
326 	wpa_printf(MSG_DEBUG, "Notifying auth timeout to hidl control");
327 
328 	HidlManager *hidl_manager = HidlManager::getInstance();
329 	if (!hidl_manager)
330 		return;
331 
332 	hidl_manager->notifyAuthTimeout(wpa_s);
333 }
334 
wpas_hidl_notify_bssid_changed(struct wpa_supplicant * wpa_s)335 void wpas_hidl_notify_bssid_changed(struct wpa_supplicant *wpa_s)
336 {
337 	if (!wpa_s)
338 		return;
339 
340 	wpa_printf(MSG_DEBUG, "Notifying bssid changed to hidl control");
341 
342 	HidlManager *hidl_manager = HidlManager::getInstance();
343 	if (!hidl_manager)
344 		return;
345 
346 	hidl_manager->notifyBssidChanged(wpa_s);
347 }
348 
wpas_hidl_notify_wps_event_fail(struct wpa_supplicant * wpa_s,uint8_t * peer_macaddr,uint16_t config_error,uint16_t error_indication)349 void wpas_hidl_notify_wps_event_fail(
350     struct wpa_supplicant *wpa_s, uint8_t *peer_macaddr, uint16_t config_error,
351     uint16_t error_indication)
352 {
353 	if (!wpa_s || !peer_macaddr)
354 		return;
355 
356 	wpa_printf(
357 	    MSG_DEBUG, "Notifying Wps event fail to hidl control: %d, %d",
358 	    config_error, error_indication);
359 
360 	HidlManager *hidl_manager = HidlManager::getInstance();
361 	if (!hidl_manager)
362 		return;
363 
364 	hidl_manager->notifyWpsEventFail(
365 	    wpa_s, peer_macaddr, config_error, error_indication);
366 }
367 
wpas_hidl_notify_wps_event_success(struct wpa_supplicant * wpa_s)368 void wpas_hidl_notify_wps_event_success(struct wpa_supplicant *wpa_s)
369 {
370 	if (!wpa_s)
371 		return;
372 
373 	wpa_printf(MSG_DEBUG, "Notifying Wps event success to hidl control");
374 
375 	HidlManager *hidl_manager = HidlManager::getInstance();
376 	if (!hidl_manager)
377 		return;
378 
379 	hidl_manager->notifyWpsEventSuccess(wpa_s);
380 }
381 
wpas_hidl_notify_wps_event_pbc_overlap(struct wpa_supplicant * wpa_s)382 void wpas_hidl_notify_wps_event_pbc_overlap(struct wpa_supplicant *wpa_s)
383 {
384 	if (!wpa_s)
385 		return;
386 
387 	wpa_printf(
388 	    MSG_DEBUG, "Notifying Wps event PBC overlap to hidl control");
389 
390 	HidlManager *hidl_manager = HidlManager::getInstance();
391 	if (!hidl_manager)
392 		return;
393 
394 	hidl_manager->notifyWpsEventPbcOverlap(wpa_s);
395 }
396 
wpas_hidl_notify_p2p_device_found(struct wpa_supplicant * wpa_s,const u8 * addr,const struct p2p_peer_info * info,const u8 * peer_wfd_device_info,u8 peer_wfd_device_info_len,const u8 * peer_wfd_r2_device_info,u8 peer_wfd_r2_device_info_len)397 void wpas_hidl_notify_p2p_device_found(
398     struct wpa_supplicant *wpa_s, const u8 *addr,
399     const struct p2p_peer_info *info, const u8 *peer_wfd_device_info,
400     u8 peer_wfd_device_info_len, const u8 *peer_wfd_r2_device_info,
401     u8 peer_wfd_r2_device_info_len)
402 {
403 	if (!wpa_s || !addr || !info)
404 		return;
405 
406 	wpa_printf(
407 	    MSG_DEBUG, "Notifying P2P device found to hidl control " MACSTR,
408 	    MAC2STR(info->p2p_device_addr));
409 
410 	HidlManager *hidl_manager = HidlManager::getInstance();
411 	if (!hidl_manager)
412 		return;
413 
414 	hidl_manager->notifyP2pDeviceFound(
415 	    wpa_s, addr, info, peer_wfd_device_info,
416 	    peer_wfd_device_info_len, peer_wfd_r2_device_info,
417 	    peer_wfd_r2_device_info_len);
418 }
419 
wpas_hidl_notify_p2p_device_lost(struct wpa_supplicant * wpa_s,const u8 * p2p_device_addr)420 void wpas_hidl_notify_p2p_device_lost(
421     struct wpa_supplicant *wpa_s, const u8 *p2p_device_addr)
422 {
423 	if (!wpa_s || !p2p_device_addr)
424 		return;
425 
426 	wpa_printf(
427 	    MSG_DEBUG, "Notifying P2P device lost to hidl control " MACSTR,
428 	    MAC2STR(p2p_device_addr));
429 
430 	HidlManager *hidl_manager = HidlManager::getInstance();
431 	if (!hidl_manager)
432 		return;
433 
434 	hidl_manager->notifyP2pDeviceLost(wpa_s, p2p_device_addr);
435 }
436 
wpas_hidl_notify_p2p_find_stopped(struct wpa_supplicant * wpa_s)437 void wpas_hidl_notify_p2p_find_stopped(struct wpa_supplicant *wpa_s)
438 {
439 	if (!wpa_s)
440 		return;
441 
442 	wpa_printf(MSG_DEBUG, "Notifying P2P find stop to hidl control");
443 
444 	HidlManager *hidl_manager = HidlManager::getInstance();
445 	if (!hidl_manager)
446 		return;
447 
448 	hidl_manager->notifyP2pFindStopped(wpa_s);
449 }
450 
wpas_hidl_notify_p2p_go_neg_req(struct wpa_supplicant * wpa_s,const u8 * src_addr,u16 dev_passwd_id,u8 go_intent)451 void wpas_hidl_notify_p2p_go_neg_req(
452     struct wpa_supplicant *wpa_s, const u8 *src_addr, u16 dev_passwd_id,
453     u8 go_intent)
454 {
455 	if (!wpa_s || !src_addr)
456 		return;
457 
458 	wpa_printf(
459 	    MSG_DEBUG,
460 	    "Notifying P2P GO negotiation request to hidl control " MACSTR,
461 	    MAC2STR(src_addr));
462 
463 	HidlManager *hidl_manager = HidlManager::getInstance();
464 	if (!hidl_manager)
465 		return;
466 
467 	hidl_manager->notifyP2pGoNegReq(
468 	    wpa_s, src_addr, dev_passwd_id, go_intent);
469 }
470 
wpas_hidl_notify_p2p_go_neg_completed(struct wpa_supplicant * wpa_s,const struct p2p_go_neg_results * res)471 void wpas_hidl_notify_p2p_go_neg_completed(
472     struct wpa_supplicant *wpa_s, const struct p2p_go_neg_results *res)
473 {
474 	if (!wpa_s || !res)
475 		return;
476 
477 	wpa_printf(
478 	    MSG_DEBUG,
479 	    "Notifying P2P GO negotiation completed to hidl control: %d",
480 	    res->status);
481 
482 	HidlManager *hidl_manager = HidlManager::getInstance();
483 	if (!hidl_manager)
484 		return;
485 
486 	hidl_manager->notifyP2pGoNegCompleted(wpa_s, res);
487 }
488 
wpas_hidl_notify_p2p_group_formation_failure(struct wpa_supplicant * wpa_s,const char * reason)489 void wpas_hidl_notify_p2p_group_formation_failure(
490     struct wpa_supplicant *wpa_s, const char *reason)
491 {
492 	if (!wpa_s || !reason)
493 		return;
494 
495 	wpa_printf(
496 	    MSG_DEBUG,
497 	    "Notifying P2P Group formation failure to hidl control: %s",
498 	    reason);
499 
500 	HidlManager *hidl_manager = HidlManager::getInstance();
501 	if (!hidl_manager)
502 		return;
503 
504 	hidl_manager->notifyP2pGroupFormationFailure(wpa_s, reason);
505 }
506 
wpas_hidl_notify_p2p_group_started(struct wpa_supplicant * wpa_s,const struct wpa_ssid * ssid,int persistent,int client)507 void wpas_hidl_notify_p2p_group_started(
508     struct wpa_supplicant *wpa_s, const struct wpa_ssid *ssid, int persistent,
509     int client)
510 {
511 	if (!wpa_s || !ssid)
512 		return;
513 
514 	wpa_printf(
515 	    MSG_DEBUG, "Notifying P2P Group start to hidl control: %d",
516 	    ssid->id);
517 
518 	HidlManager *hidl_manager = HidlManager::getInstance();
519 	if (!hidl_manager)
520 		return;
521 
522 	hidl_manager->notifyP2pGroupStarted(wpa_s, ssid, persistent, client);
523 }
524 
wpas_hidl_notify_p2p_group_removed(struct wpa_supplicant * wpa_s,const struct wpa_ssid * ssid,const char * role)525 void wpas_hidl_notify_p2p_group_removed(
526     struct wpa_supplicant *wpa_s, const struct wpa_ssid *ssid, const char *role)
527 {
528 	if (!wpa_s || !ssid || !role)
529 		return;
530 
531 	wpa_printf(
532 	    MSG_DEBUG, "Notifying P2P Group removed to hidl control: %d",
533 	    ssid->id);
534 
535 	HidlManager *hidl_manager = HidlManager::getInstance();
536 	if (!hidl_manager)
537 		return;
538 
539 	hidl_manager->notifyP2pGroupRemoved(wpa_s, ssid, role);
540 }
541 
wpas_hidl_notify_p2p_invitation_received(struct wpa_supplicant * wpa_s,const u8 * sa,const u8 * go_dev_addr,const u8 * bssid,int id,int op_freq)542 void wpas_hidl_notify_p2p_invitation_received(
543     struct wpa_supplicant *wpa_s, const u8 *sa, const u8 *go_dev_addr,
544     const u8 *bssid, int id, int op_freq)
545 {
546 	if (!wpa_s || !sa || !go_dev_addr || !bssid)
547 		return;
548 
549 	wpa_printf(
550 	    MSG_DEBUG,
551 	    "Notifying P2P invitation received to hidl control: %d " MACSTR, id,
552 	    MAC2STR(bssid));
553 
554 	HidlManager *hidl_manager = HidlManager::getInstance();
555 	if (!hidl_manager)
556 		return;
557 
558 	hidl_manager->notifyP2pInvitationReceived(
559 	    wpa_s, sa, go_dev_addr, bssid, id, op_freq);
560 }
561 
wpas_hidl_notify_p2p_invitation_result(struct wpa_supplicant * wpa_s,int status,const u8 * bssid)562 void wpas_hidl_notify_p2p_invitation_result(
563     struct wpa_supplicant *wpa_s, int status, const u8 *bssid)
564 {
565 	if (!wpa_s)
566 		return;
567 	if (bssid) {
568 		wpa_printf(
569 		    MSG_DEBUG,
570 		    "Notifying P2P invitation result to hidl control: " MACSTR,
571 		    MAC2STR(bssid));
572 	} else {
573 		wpa_printf(
574 		    MSG_DEBUG,
575 		    "Notifying P2P invitation result to hidl control: NULL "
576 		    "bssid");
577 	}
578 
579 	HidlManager *hidl_manager = HidlManager::getInstance();
580 	if (!hidl_manager)
581 		return;
582 
583 	hidl_manager->notifyP2pInvitationResult(wpa_s, status, bssid);
584 }
585 
wpas_hidl_notify_p2p_provision_discovery(struct wpa_supplicant * wpa_s,const u8 * dev_addr,int request,enum p2p_prov_disc_status status,u16 config_methods,unsigned int generated_pin)586 void wpas_hidl_notify_p2p_provision_discovery(
587     struct wpa_supplicant *wpa_s, const u8 *dev_addr, int request,
588     enum p2p_prov_disc_status status, u16 config_methods,
589     unsigned int generated_pin)
590 {
591 	if (!wpa_s || !dev_addr)
592 		return;
593 
594 	wpa_printf(
595 	    MSG_DEBUG,
596 	    "Notifying P2P provision discovery to hidl control " MACSTR,
597 	    MAC2STR(dev_addr));
598 
599 	HidlManager *hidl_manager = HidlManager::getInstance();
600 	if (!hidl_manager)
601 		return;
602 
603 	hidl_manager->notifyP2pProvisionDiscovery(
604 	    wpa_s, dev_addr, request, status, config_methods, generated_pin);
605 }
606 
wpas_hidl_notify_p2p_sd_response(struct wpa_supplicant * wpa_s,const u8 * sa,u16 update_indic,const u8 * tlvs,size_t tlvs_len)607 void wpas_hidl_notify_p2p_sd_response(
608     struct wpa_supplicant *wpa_s, const u8 *sa, u16 update_indic,
609     const u8 *tlvs, size_t tlvs_len)
610 {
611 	if (!wpa_s || !sa || !tlvs)
612 		return;
613 
614 	wpa_printf(
615 	    MSG_DEBUG,
616 	    "Notifying P2P service discovery response to hidl control " MACSTR,
617 	    MAC2STR(sa));
618 
619 	HidlManager *hidl_manager = HidlManager::getInstance();
620 	if (!hidl_manager)
621 		return;
622 
623 	hidl_manager->notifyP2pSdResponse(
624 	    wpa_s, sa, update_indic, tlvs, tlvs_len);
625 }
626 
wpas_hidl_notify_ap_sta_authorized(struct wpa_supplicant * wpa_s,const u8 * sta,const u8 * p2p_dev_addr)627 void wpas_hidl_notify_ap_sta_authorized(
628     struct wpa_supplicant *wpa_s, const u8 *sta, const u8 *p2p_dev_addr)
629 {
630 	if (!wpa_s || !sta)
631 		return;
632 
633 	wpa_printf(
634 	    MSG_DEBUG,
635 	    "Notifying P2P AP STA authorized to hidl control " MACSTR,
636 	    MAC2STR(sta));
637 
638 	HidlManager *hidl_manager = HidlManager::getInstance();
639 	if (!hidl_manager)
640 		return;
641 
642 	hidl_manager->notifyApStaAuthorized(wpa_s, sta, p2p_dev_addr);
643 }
644 
wpas_hidl_notify_ap_sta_deauthorized(struct wpa_supplicant * wpa_s,const u8 * sta,const u8 * p2p_dev_addr)645 void wpas_hidl_notify_ap_sta_deauthorized(
646     struct wpa_supplicant *wpa_s, const u8 *sta, const u8 *p2p_dev_addr)
647 {
648 	if (!wpa_s || !sta)
649 		return;
650 
651 	wpa_printf(
652 	    MSG_DEBUG,
653 	    "Notifying P2P AP STA deauthorized to hidl control " MACSTR,
654 	    MAC2STR(sta));
655 
656 	HidlManager *hidl_manager = HidlManager::getInstance();
657 	if (!hidl_manager)
658 		return;
659 
660 	hidl_manager->notifyApStaDeauthorized(wpa_s, sta, p2p_dev_addr);
661 }
662 
wpas_hidl_notify_eap_error(struct wpa_supplicant * wpa_s,int error_code)663 void wpas_hidl_notify_eap_error(struct wpa_supplicant *wpa_s, int error_code)
664 {
665 	if (!wpa_s)
666 		return;
667 
668 	wpa_printf(MSG_DEBUG, "Notifying EAP Error: %d ", error_code);
669 
670 	HidlManager *hidl_manager = HidlManager::getInstance();
671 	if (!hidl_manager)
672 		return;
673 
674 	hidl_manager->notifyEapError(wpa_s, error_code);
675 }
676 
wpas_hidl_notify_dpp_config_received(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)677 void wpas_hidl_notify_dpp_config_received(struct wpa_supplicant *wpa_s,
678 	    struct wpa_ssid *ssid)
679 {
680 	if (!wpa_s || !ssid)
681 		return;
682 
683 	wpa_printf(
684 	    MSG_DEBUG,
685 	    "Notifying DPP configuration received for SSID %d", ssid->id);
686 
687 	HidlManager *hidl_manager = HidlManager::getInstance();
688 	if (!hidl_manager)
689 		return;
690 
691 	hidl_manager->notifyDppConfigReceived(wpa_s, ssid);
692 }
693 
wpas_hidl_notify_dpp_config_sent(struct wpa_supplicant * wpa_s)694 void wpas_hidl_notify_dpp_config_sent(struct wpa_supplicant *wpa_s)
695 {
696 	wpas_hidl_notify_dpp_success(wpa_s, DppSuccessCode::CONFIGURATION_SENT);
697 }
698 
699 /* DPP Progress notifications */
wpas_hidl_notify_dpp_auth_success(struct wpa_supplicant * wpa_s)700 void wpas_hidl_notify_dpp_auth_success(struct wpa_supplicant *wpa_s)
701 {
702 	wpas_hidl_notify_dpp_progress(wpa_s, DppProgressCode::AUTHENTICATION_SUCCESS);
703 }
704 
wpas_hidl_notify_dpp_resp_pending(struct wpa_supplicant * wpa_s)705 void wpas_hidl_notify_dpp_resp_pending(struct wpa_supplicant *wpa_s)
706 {
707 	wpas_hidl_notify_dpp_progress(wpa_s, DppProgressCode::RESPONSE_PENDING);
708 }
709 
710 /* DPP Failure notifications */
wpas_hidl_notify_dpp_not_compatible(struct wpa_supplicant * wpa_s)711 void wpas_hidl_notify_dpp_not_compatible(struct wpa_supplicant *wpa_s)
712 {
713 	wpas_hidl_notify_dpp_failure(wpa_s, DppFailureCode::NOT_COMPATIBLE);
714 }
715 
wpas_hidl_notify_dpp_missing_auth(struct wpa_supplicant * wpa_s)716 void wpas_hidl_notify_dpp_missing_auth(struct wpa_supplicant *wpa_s)
717 {
718 	wpas_hidl_notify_dpp_failure(wpa_s, DppFailureCode::AUTHENTICATION);
719 }
720 
wpas_hidl_notify_dpp_configuration_failure(struct wpa_supplicant * wpa_s)721 void wpas_hidl_notify_dpp_configuration_failure(struct wpa_supplicant *wpa_s)
722 {
723 	wpas_hidl_notify_dpp_failure(wpa_s, DppFailureCode::CONFIGURATION);
724 }
725 
wpas_hidl_notify_dpp_timeout(struct wpa_supplicant * wpa_s)726 void wpas_hidl_notify_dpp_timeout(struct wpa_supplicant *wpa_s)
727 {
728 	wpas_hidl_notify_dpp_failure(wpa_s, DppFailureCode::TIMEOUT);
729 }
730 
wpas_hidl_notify_dpp_auth_failure(struct wpa_supplicant * wpa_s)731 void wpas_hidl_notify_dpp_auth_failure(struct wpa_supplicant *wpa_s)
732 {
733 	wpas_hidl_notify_dpp_failure(wpa_s, DppFailureCode::AUTHENTICATION);
734 }
735 
wpas_hidl_notify_dpp_fail(struct wpa_supplicant * wpa_s)736 void wpas_hidl_notify_dpp_fail(struct wpa_supplicant *wpa_s)
737 {
738 	wpas_hidl_notify_dpp_failure(wpa_s, DppFailureCode::FAILURE);
739 }
740 
wpas_hidl_notify_dpp_config_sent_wait_response(struct wpa_supplicant * wpa_s)741 void wpas_hidl_notify_dpp_config_sent_wait_response(struct wpa_supplicant *wpa_s)
742 {
743 	wpas_hidl_notify_dpp_progress(wpa_s, DppProgressCode::CONFIGURATION_SENT_WAITING_RESPONSE);
744 }
745 
746 /* DPP notification helper functions */
wpas_hidl_notify_dpp_failure(struct wpa_supplicant * wpa_s,DppFailureCode code)747 static void wpas_hidl_notify_dpp_failure(struct wpa_supplicant *wpa_s, DppFailureCode code)
748 {
749 	if (!wpa_s)
750 		return;
751 
752 	wpa_printf(
753 	    MSG_DEBUG,
754 	    "Notifying DPP failure event %d", code);
755 
756 	HidlManager *hidl_manager = HidlManager::getInstance();
757 	if (!hidl_manager)
758 		return;
759 
760 	hidl_manager->notifyDppFailure(wpa_s, code);
761 }
762 
wpas_hidl_notify_dpp_progress(struct wpa_supplicant * wpa_s,DppProgressCode code)763 static void wpas_hidl_notify_dpp_progress(struct wpa_supplicant *wpa_s, DppProgressCode code)
764 {
765 	if (!wpa_s)
766 		return;
767 
768 	wpa_printf(
769 	    MSG_DEBUG,
770 	    "Notifying DPP progress event %d", code);
771 
772 	HidlManager *hidl_manager = HidlManager::getInstance();
773 	if (!hidl_manager)
774 		return;
775 
776 	hidl_manager->notifyDppProgress(wpa_s, code);
777 }
778 
wpas_hidl_notify_dpp_config_accepted(struct wpa_supplicant * wpa_s)779 void wpas_hidl_notify_dpp_config_accepted(struct wpa_supplicant *wpa_s)
780 {
781 	wpas_hidl_notify_dpp_progress(wpa_s, DppProgressCode::CONFIGURATION_ACCEPTED);
782 }
783 
wpas_hidl_notify_dpp_config_applied(struct wpa_supplicant * wpa_s)784 static void wpas_hidl_notify_dpp_config_applied(struct wpa_supplicant *wpa_s)
785 {
786 	wpas_hidl_notify_dpp_success(wpa_s, DppSuccessCode::CONFIGURATION_APPLIED);
787 }
788 
wpas_hidl_notify_dpp_success(struct wpa_supplicant * wpa_s,DppSuccessCode code)789 static void wpas_hidl_notify_dpp_success(struct wpa_supplicant *wpa_s, DppSuccessCode code)
790 {
791 	if (!wpa_s)
792 		return;
793 
794 	wpa_printf(
795 	    MSG_DEBUG,
796 	    "Notifying DPP progress event %d", code);
797 
798 	HidlManager *hidl_manager = HidlManager::getInstance();
799 	if (!hidl_manager)
800 		return;
801 
802 	hidl_manager->notifyDppSuccess(wpa_s, code);
803 }
804 
wpas_hidl_notify_dpp_config_rejected(struct wpa_supplicant * wpa_s)805 void wpas_hidl_notify_dpp_config_rejected(struct wpa_supplicant *wpa_s)
806 {
807 	wpas_hidl_notify_dpp_failure(wpa_s, DppFailureCode::CONFIGURATION_REJECTED);
808 }
809 
wpas_hidl_notify_dpp_no_ap_failure(struct wpa_supplicant * wpa_s,const char * ssid,const char * channel_list,unsigned short band_list[],int size)810 static void wpas_hidl_notify_dpp_no_ap_failure(struct wpa_supplicant *wpa_s,
811 		const char *ssid, const char *channel_list, unsigned short band_list[],
812 		int size)
813 {
814 	if (!wpa_s)
815 		return;
816 
817 	wpa_printf(MSG_DEBUG,
818 			"Notifying DPP NO AP event for SSID %s\nTried channels: %s",
819 			ssid ? ssid : "N/A", channel_list ? channel_list : "N/A");
820 
821 	HidlManager *hidl_manager = HidlManager::getInstance();
822 	if (!hidl_manager)
823 		return;
824 
825 	hidl_manager->notifyDppFailure(wpa_s, DppFailureCode::CANNOT_FIND_NETWORK,
826 			ssid, channel_list, band_list, size);
827 }
828 
wpas_hidl_notify_dpp_enrollee_auth_failure(struct wpa_supplicant * wpa_s,const char * ssid,unsigned short band_list[],int size)829 void wpas_hidl_notify_dpp_enrollee_auth_failure(struct wpa_supplicant *wpa_s,
830 		const char *ssid, unsigned short band_list[], int size)
831 {
832 	if (!wpa_s)
833 		return;
834 
835 	wpa_printf(MSG_DEBUG,
836 			"Notifying DPP Enrollee authentication failure, SSID %s",
837 			ssid ? ssid : "N/A");
838 
839 	HidlManager *hidl_manager = HidlManager::getInstance();
840 	if (!hidl_manager)
841 		return;
842 
843 	hidl_manager->notifyDppFailure(wpa_s, DppFailureCode::ENROLLEE_AUTHENTICATION,
844 			ssid, NULL, band_list, size);
845 }
846 
847 
wpas_hidl_notify_dpp_conn_status(struct wpa_supplicant * wpa_s,enum dpp_status_error status,const char * ssid,const char * channel_list,unsigned short band_list[],int size)848 void wpas_hidl_notify_dpp_conn_status(struct wpa_supplicant *wpa_s, enum dpp_status_error status,
849 		const char *ssid, const char *channel_list, unsigned short band_list[], int size)
850 {
851 	switch (status)
852 	{
853 	case DPP_STATUS_OK:
854 		wpas_hidl_notify_dpp_config_applied(wpa_s);
855 		break;
856 
857 	case DPP_STATUS_NO_AP:
858 		wpas_hidl_notify_dpp_no_ap_failure(wpa_s, ssid, channel_list, band_list, size);
859 		break;
860 
861 	case DPP_STATUS_AUTH_FAILURE:
862 		wpas_hidl_notify_dpp_enrollee_auth_failure(wpa_s, ssid, band_list, size);
863 		break;
864 
865 	default:
866 		break;
867 	}
868 }
869 
wpas_hidl_notify_pmk_cache_added(struct wpa_supplicant * wpa_s,struct rsn_pmksa_cache_entry * pmksa_entry)870 void wpas_hidl_notify_pmk_cache_added(
871     struct wpa_supplicant *wpa_s,
872     struct rsn_pmksa_cache_entry *pmksa_entry)
873 {
874 	if (!wpa_s || !pmksa_entry)
875 		return;
876 
877 	HidlManager *hidl_manager = HidlManager::getInstance();
878 	if (!hidl_manager)
879 		return;
880 
881 	wpa_printf(
882 	    MSG_DEBUG,
883 	    "Notifying PMK cache added event");
884 
885 	hidl_manager->notifyPmkCacheAdded(wpa_s, pmksa_entry);
886 }
887 
wpas_hidl_notify_bss_tm_status(struct wpa_supplicant * wpa_s)888 void wpas_hidl_notify_bss_tm_status(struct wpa_supplicant *wpa_s)
889 {
890 	if (!wpa_s)
891 		return;
892 
893 	HidlManager *hidl_manager = HidlManager::getInstance();
894 	if (!hidl_manager)
895 		return;
896 
897 	wpa_printf(MSG_DEBUG, "Notifying BSS transition status");
898 
899 	hidl_manager->notifyBssTmStatus(wpa_s);
900 }
901 
wpas_hidl_notify_transition_disable(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid,u8 bitmap)902 void wpas_hidl_notify_transition_disable(struct wpa_supplicant *wpa_s,
903 					    struct wpa_ssid *ssid,
904 					    u8 bitmap)
905 {
906 	if (!wpa_s || !ssid)
907 		return;
908 
909 	HidlManager *hidl_manager = HidlManager::getInstance();
910 	if (!hidl_manager)
911 		return;
912 
913 	hidl_manager->notifyTransitionDisable(wpa_s, ssid, bitmap);
914 }
915 
wpas_hidl_notify_network_not_found(struct wpa_supplicant * wpa_s)916 void wpas_hidl_notify_network_not_found(struct wpa_supplicant *wpa_s)
917 {
918 	if (!wpa_s)
919 		return;
920 
921 	HidlManager *hidl_manager = HidlManager::getInstance();
922 	if (!hidl_manager)
923 		return;
924 
925 	wpa_printf(MSG_DEBUG, "Notify network not found");
926 
927 	hidl_manager->notifyNetworkNotFound(wpa_s);
928 }
929