• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * wpa_supplicant - Event notifications
3  * Copyright (c) 2009-2010, Jouni Malinen <j@w1.fi>
4  *
5  * This software may be distributed under the terms of the BSD license.
6  * See README for more details.
7  */
8 
9 #include "utils/includes.h"
10 
11 #include "utils/common.h"
12 #include "common/wpa_ctrl.h"
13 #include "config.h"
14 #include "wpa_supplicant_i.h"
15 #include "wps_supplicant.h"
16 #include "dbus/dbus_common.h"
17 #include "dbus/dbus_old.h"
18 #include "dbus/dbus_new.h"
19 #include "rsn_supp/wpa.h"
20 #include "fst/fst.h"
21 #include "driver_i.h"
22 #include "scan.h"
23 #include "p2p_supplicant.h"
24 #include "sme.h"
25 #include "notify.h"
26 #include "hidl.h"
27 
wpas_notify_supplicant_initialized(struct wpa_global * global)28 int wpas_notify_supplicant_initialized(struct wpa_global *global)
29 {
30 #ifdef CONFIG_DBUS
31 	if (global->params.dbus_ctrl_interface) {
32 		global->dbus = wpas_dbus_init(global);
33 		if (global->dbus == NULL)
34 			return -1;
35 	}
36 #endif /* CONFIG_DBUS */
37 
38 #ifdef CONFIG_HIDL
39 	global->hidl = wpas_hidl_init(global);
40 	if (!global->hidl)
41 		return -1;
42 #endif /* CONFIG_HIDL */
43 
44 	return 0;
45 }
46 
47 
wpas_notify_supplicant_deinitialized(struct wpa_global * global)48 void wpas_notify_supplicant_deinitialized(struct wpa_global *global)
49 {
50 #ifdef CONFIG_DBUS
51 	if (global->dbus)
52 		wpas_dbus_deinit(global->dbus);
53 #endif /* CONFIG_DBUS */
54 
55 #ifdef CONFIG_HIDL
56 	if (global->hidl)
57 		wpas_hidl_deinit(global->hidl);
58 #endif /* CONFIG_HIDL */
59 }
60 
61 
wpas_notify_iface_added(struct wpa_supplicant * wpa_s)62 int wpas_notify_iface_added(struct wpa_supplicant *wpa_s)
63 {
64 	if (!wpa_s->p2p_mgmt) {
65 		if (wpas_dbus_register_iface(wpa_s))
66 			return -1;
67 
68 		if (wpas_dbus_register_interface(wpa_s))
69 			return -1;
70 	}
71 
72 	/* HIDL interface wants to keep track of the P2P mgmt iface. */
73 	if (wpas_hidl_register_interface(wpa_s))
74 		return -1;
75 
76 	return 0;
77 }
78 
79 
wpas_notify_iface_removed(struct wpa_supplicant * wpa_s)80 void wpas_notify_iface_removed(struct wpa_supplicant *wpa_s)
81 {
82 	if (!wpa_s->p2p_mgmt) {
83 		/* unregister interface in old DBus ctrl iface */
84 		wpas_dbus_unregister_iface(wpa_s);
85 
86 		/* unregister interface in new DBus ctrl iface */
87 		wpas_dbus_unregister_interface(wpa_s);
88 	}
89 
90 	/* HIDL interface wants to keep track of the P2P mgmt iface. */
91 	wpas_hidl_unregister_interface(wpa_s);
92 }
93 
94 
wpas_notify_state_changed(struct wpa_supplicant * wpa_s,enum wpa_states new_state,enum wpa_states old_state)95 void wpas_notify_state_changed(struct wpa_supplicant *wpa_s,
96 			       enum wpa_states new_state,
97 			       enum wpa_states old_state)
98 {
99 	if (wpa_s->p2p_mgmt)
100 		return;
101 
102 	/* notify the old DBus API */
103 	wpa_supplicant_dbus_notify_state_change(wpa_s, new_state,
104 						old_state);
105 
106 	/* notify the new DBus API */
107 	wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_STATE);
108 
109 #ifdef CONFIG_FST
110 	if (wpa_s->fst && !is_zero_ether_addr(wpa_s->bssid)) {
111 		if (new_state == WPA_COMPLETED)
112 			fst_notify_peer_connected(wpa_s->fst, wpa_s->bssid);
113 		else if (old_state >= WPA_ASSOCIATED &&
114 			 new_state < WPA_ASSOCIATED)
115 			fst_notify_peer_disconnected(wpa_s->fst, wpa_s->bssid);
116 	}
117 #endif /* CONFIG_FST */
118 
119 	if (new_state == WPA_COMPLETED)
120 		wpas_p2p_notif_connected(wpa_s);
121 	else if (old_state >= WPA_ASSOCIATED && new_state < WPA_ASSOCIATED)
122 		wpas_p2p_notif_disconnected(wpa_s);
123 
124 	sme_state_changed(wpa_s);
125 
126 #ifdef ANDROID
127 	wpa_msg_ctrl(wpa_s, MSG_INFO, WPA_EVENT_STATE_CHANGE
128 		     "id=%d state=%d BSSID=" MACSTR " SSID=%s",
129 		     wpa_s->current_ssid ? wpa_s->current_ssid->id : -1,
130 		     new_state,
131 		     MAC2STR(wpa_s->bssid),
132 		     wpa_s->current_ssid && wpa_s->current_ssid->ssid ?
133 		     wpa_ssid_txt(wpa_s->current_ssid->ssid,
134 				  wpa_s->current_ssid->ssid_len) : "");
135 #endif /* ANDROID */
136 
137 	wpas_hidl_notify_state_changed(wpa_s);
138 }
139 
140 
wpas_notify_disconnect_reason(struct wpa_supplicant * wpa_s)141 void wpas_notify_disconnect_reason(struct wpa_supplicant *wpa_s)
142 {
143 	if (wpa_s->p2p_mgmt)
144 		return;
145 
146 	wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_DISCONNECT_REASON);
147 
148 	wpas_hidl_notify_disconnect_reason(wpa_s);
149 }
150 
151 
wpas_notify_assoc_status_code(struct wpa_supplicant * wpa_s)152 void wpas_notify_assoc_status_code(struct wpa_supplicant *wpa_s)
153 {
154 	if (wpa_s->p2p_mgmt)
155 		return;
156 
157 	wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_ASSOC_STATUS_CODE);
158 
159 	wpas_hidl_notify_assoc_reject(wpa_s);
160 }
161 
wpas_notify_auth_timeout(struct wpa_supplicant * wpa_s)162 void wpas_notify_auth_timeout(struct wpa_supplicant *wpa_s) {
163 	if (wpa_s->p2p_mgmt)
164 		return;
165 
166 	wpas_hidl_notify_auth_timeout(wpa_s);
167 }
168 
wpas_notify_network_changed(struct wpa_supplicant * wpa_s)169 void wpas_notify_network_changed(struct wpa_supplicant *wpa_s)
170 {
171 	if (wpa_s->p2p_mgmt)
172 		return;
173 
174 	wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_CURRENT_NETWORK);
175 }
176 
177 
wpas_notify_ap_scan_changed(struct wpa_supplicant * wpa_s)178 void wpas_notify_ap_scan_changed(struct wpa_supplicant *wpa_s)
179 {
180 	if (wpa_s->p2p_mgmt)
181 		return;
182 
183 	wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_AP_SCAN);
184 }
185 
186 
wpas_notify_bssid_changed(struct wpa_supplicant * wpa_s)187 void wpas_notify_bssid_changed(struct wpa_supplicant *wpa_s)
188 {
189 	if (wpa_s->p2p_mgmt)
190 		return;
191 
192 	wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_CURRENT_BSS);
193 
194 	wpas_hidl_notify_bssid_changed(wpa_s);
195 }
196 
197 
wpas_notify_auth_changed(struct wpa_supplicant * wpa_s)198 void wpas_notify_auth_changed(struct wpa_supplicant *wpa_s)
199 {
200 	if (wpa_s->p2p_mgmt)
201 		return;
202 
203 	wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_CURRENT_AUTH_MODE);
204 }
205 
206 
wpas_notify_network_enabled_changed(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)207 void wpas_notify_network_enabled_changed(struct wpa_supplicant *wpa_s,
208 					 struct wpa_ssid *ssid)
209 {
210 	if (wpa_s->p2p_mgmt)
211 		return;
212 
213 	wpas_dbus_signal_network_enabled_changed(wpa_s, ssid);
214 }
215 
216 
wpas_notify_network_selected(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)217 void wpas_notify_network_selected(struct wpa_supplicant *wpa_s,
218 				  struct wpa_ssid *ssid)
219 {
220 	if (wpa_s->p2p_mgmt)
221 		return;
222 
223 	wpas_dbus_signal_network_selected(wpa_s, ssid->id);
224 }
225 
226 
wpas_notify_network_request(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid,enum wpa_ctrl_req_type rtype,const char * default_txt)227 void wpas_notify_network_request(struct wpa_supplicant *wpa_s,
228 				 struct wpa_ssid *ssid,
229 				 enum wpa_ctrl_req_type rtype,
230 				 const char *default_txt)
231 {
232 	if (wpa_s->p2p_mgmt)
233 		return;
234 
235 	wpas_dbus_signal_network_request(wpa_s, ssid, rtype, default_txt);
236 
237 	wpas_hidl_notify_network_request(wpa_s, ssid, rtype, default_txt);
238 }
239 
240 
wpas_notify_scanning(struct wpa_supplicant * wpa_s)241 void wpas_notify_scanning(struct wpa_supplicant *wpa_s)
242 {
243 	if (wpa_s->p2p_mgmt)
244 		return;
245 
246 	/* notify the old DBus API */
247 	wpa_supplicant_dbus_notify_scanning(wpa_s);
248 
249 	/* notify the new DBus API */
250 	wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_SCANNING);
251 }
252 
253 
wpas_notify_scan_done(struct wpa_supplicant * wpa_s,int success)254 void wpas_notify_scan_done(struct wpa_supplicant *wpa_s, int success)
255 {
256 	if (wpa_s->p2p_mgmt)
257 		return;
258 
259 	wpas_dbus_signal_scan_done(wpa_s, success);
260 }
261 
262 
wpas_notify_scan_results(struct wpa_supplicant * wpa_s)263 void wpas_notify_scan_results(struct wpa_supplicant *wpa_s)
264 {
265 	if (wpa_s->p2p_mgmt)
266 		return;
267 
268 	/* notify the old DBus API */
269 	wpa_supplicant_dbus_notify_scan_results(wpa_s);
270 
271 	wpas_wps_notify_scan_results(wpa_s);
272 }
273 
274 
wpas_notify_wps_credential(struct wpa_supplicant * wpa_s,const struct wps_credential * cred)275 void wpas_notify_wps_credential(struct wpa_supplicant *wpa_s,
276 				const struct wps_credential *cred)
277 {
278 	if (wpa_s->p2p_mgmt)
279 		return;
280 
281 #ifdef CONFIG_WPS
282 	/* notify the old DBus API */
283 	wpa_supplicant_dbus_notify_wps_cred(wpa_s, cred);
284 	/* notify the new DBus API */
285 	wpas_dbus_signal_wps_cred(wpa_s, cred);
286 #endif /* CONFIG_WPS */
287 }
288 
289 
wpas_notify_wps_event_m2d(struct wpa_supplicant * wpa_s,struct wps_event_m2d * m2d)290 void wpas_notify_wps_event_m2d(struct wpa_supplicant *wpa_s,
291 			       struct wps_event_m2d *m2d)
292 {
293 	if (wpa_s->p2p_mgmt)
294 		return;
295 
296 #ifdef CONFIG_WPS
297 	wpas_dbus_signal_wps_event_m2d(wpa_s, m2d);
298 #endif /* CONFIG_WPS */
299 }
300 
301 
wpas_notify_wps_event_fail(struct wpa_supplicant * wpa_s,struct wps_event_fail * fail)302 void wpas_notify_wps_event_fail(struct wpa_supplicant *wpa_s,
303 				struct wps_event_fail *fail)
304 {
305 	if (wpa_s->p2p_mgmt)
306 		return;
307 
308 #ifdef CONFIG_WPS
309 	wpas_dbus_signal_wps_event_fail(wpa_s, fail);
310 
311 	wpas_hidl_notify_wps_event_fail(wpa_s, fail->peer_macaddr,
312 					fail->config_error,
313 					fail->error_indication);
314 #endif /* CONFIG_WPS */
315 }
316 
317 
wpas_notify_wps_event_success(struct wpa_supplicant * wpa_s)318 void wpas_notify_wps_event_success(struct wpa_supplicant *wpa_s)
319 {
320 	if (wpa_s->p2p_mgmt)
321 		return;
322 
323 #ifdef CONFIG_WPS
324 	wpas_dbus_signal_wps_event_success(wpa_s);
325 
326 	wpas_hidl_notify_wps_event_success(wpa_s);
327 #endif /* CONFIG_WPS */
328 }
329 
wpas_notify_wps_event_pbc_overlap(struct wpa_supplicant * wpa_s)330 void wpas_notify_wps_event_pbc_overlap(struct wpa_supplicant *wpa_s)
331 {
332 	if (wpa_s->p2p_mgmt)
333 		return;
334 
335 #ifdef CONFIG_WPS
336 	wpas_dbus_signal_wps_event_pbc_overlap(wpa_s);
337 
338 	wpas_hidl_notify_wps_event_pbc_overlap(wpa_s);
339 #endif /* CONFIG_WPS */
340 }
341 
342 
wpas_notify_network_added(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)343 void wpas_notify_network_added(struct wpa_supplicant *wpa_s,
344 			       struct wpa_ssid *ssid)
345 {
346 	if (wpa_s->p2p_mgmt)
347 		return;
348 
349 	/*
350 	 * Networks objects created during any P2P activities should not be
351 	 * exposed out. They might/will confuse certain non-P2P aware
352 	 * applications since these network objects won't behave like
353 	 * regular ones.
354 	 */
355 	if (!ssid->p2p_group && wpa_s->global->p2p_group_formation != wpa_s) {
356 		wpas_dbus_register_network(wpa_s, ssid);
357 		wpas_hidl_register_network(wpa_s, ssid);
358 	}
359 }
360 
361 
wpas_notify_persistent_group_added(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)362 void wpas_notify_persistent_group_added(struct wpa_supplicant *wpa_s,
363 					struct wpa_ssid *ssid)
364 {
365 #ifdef CONFIG_P2P
366 	wpas_dbus_register_persistent_group(wpa_s, ssid);
367 	wpas_hidl_register_network(wpa_s, ssid);
368 #endif /* CONFIG_P2P */
369 }
370 
371 
wpas_notify_persistent_group_removed(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)372 void wpas_notify_persistent_group_removed(struct wpa_supplicant *wpa_s,
373 					  struct wpa_ssid *ssid)
374 {
375 #ifdef CONFIG_P2P
376 	wpas_dbus_unregister_persistent_group(wpa_s, ssid->id);
377 	wpas_hidl_unregister_network(wpa_s, ssid);
378 #endif /* CONFIG_P2P */
379 }
380 
381 
wpas_notify_network_removed(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)382 void wpas_notify_network_removed(struct wpa_supplicant *wpa_s,
383 				 struct wpa_ssid *ssid)
384 {
385 	if (wpa_s->next_ssid == ssid)
386 		wpa_s->next_ssid = NULL;
387 	if (wpa_s->wpa)
388 		wpa_sm_pmksa_cache_flush(wpa_s->wpa, ssid);
389 	if (!ssid->p2p_group && wpa_s->global->p2p_group_formation != wpa_s &&
390 	    !wpa_s->p2p_mgmt) {
391 		wpas_dbus_unregister_network(wpa_s, ssid->id);
392 		wpas_hidl_unregister_network(wpa_s, ssid);
393 	}
394 	if (network_is_persistent_group(ssid))
395 		wpas_notify_persistent_group_removed(wpa_s, ssid);
396 
397 	wpas_p2p_network_removed(wpa_s, ssid);
398 }
399 
400 
wpas_notify_bss_added(struct wpa_supplicant * wpa_s,u8 bssid[],unsigned int id)401 void wpas_notify_bss_added(struct wpa_supplicant *wpa_s,
402 			   u8 bssid[], unsigned int id)
403 {
404 	if (wpa_s->p2p_mgmt)
405 		return;
406 
407 	wpas_dbus_register_bss(wpa_s, bssid, id);
408 	wpa_msg_ctrl(wpa_s, MSG_INFO, WPA_EVENT_BSS_ADDED "%u " MACSTR,
409 		     id, MAC2STR(bssid));
410 }
411 
412 
wpas_notify_bss_removed(struct wpa_supplicant * wpa_s,u8 bssid[],unsigned int id)413 void wpas_notify_bss_removed(struct wpa_supplicant *wpa_s,
414 			     u8 bssid[], unsigned int id)
415 {
416 	if (wpa_s->p2p_mgmt)
417 		return;
418 
419 	wpas_dbus_unregister_bss(wpa_s, bssid, id);
420 	wpa_msg_ctrl(wpa_s, MSG_INFO, WPA_EVENT_BSS_REMOVED "%u " MACSTR,
421 		     id, MAC2STR(bssid));
422 }
423 
424 
wpas_notify_bss_freq_changed(struct wpa_supplicant * wpa_s,unsigned int id)425 void wpas_notify_bss_freq_changed(struct wpa_supplicant *wpa_s,
426 				  unsigned int id)
427 {
428 	if (wpa_s->p2p_mgmt)
429 		return;
430 
431 	wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_FREQ, id);
432 }
433 
434 
wpas_notify_bss_signal_changed(struct wpa_supplicant * wpa_s,unsigned int id)435 void wpas_notify_bss_signal_changed(struct wpa_supplicant *wpa_s,
436 				    unsigned int id)
437 {
438 	if (wpa_s->p2p_mgmt)
439 		return;
440 
441 	wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_SIGNAL,
442 					  id);
443 }
444 
445 
wpas_notify_bss_privacy_changed(struct wpa_supplicant * wpa_s,unsigned int id)446 void wpas_notify_bss_privacy_changed(struct wpa_supplicant *wpa_s,
447 				     unsigned int id)
448 {
449 	if (wpa_s->p2p_mgmt)
450 		return;
451 
452 	wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_PRIVACY,
453 					  id);
454 }
455 
456 
wpas_notify_bss_mode_changed(struct wpa_supplicant * wpa_s,unsigned int id)457 void wpas_notify_bss_mode_changed(struct wpa_supplicant *wpa_s,
458 				  unsigned int id)
459 {
460 	if (wpa_s->p2p_mgmt)
461 		return;
462 
463 	wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_MODE, id);
464 }
465 
466 
wpas_notify_bss_wpaie_changed(struct wpa_supplicant * wpa_s,unsigned int id)467 void wpas_notify_bss_wpaie_changed(struct wpa_supplicant *wpa_s,
468 				   unsigned int id)
469 {
470 	if (wpa_s->p2p_mgmt)
471 		return;
472 
473 	wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_WPA, id);
474 }
475 
476 
wpas_notify_bss_rsnie_changed(struct wpa_supplicant * wpa_s,unsigned int id)477 void wpas_notify_bss_rsnie_changed(struct wpa_supplicant *wpa_s,
478 				   unsigned int id)
479 {
480 	if (wpa_s->p2p_mgmt)
481 		return;
482 
483 	wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_RSN, id);
484 }
485 
486 
wpas_notify_bss_wps_changed(struct wpa_supplicant * wpa_s,unsigned int id)487 void wpas_notify_bss_wps_changed(struct wpa_supplicant *wpa_s,
488 				 unsigned int id)
489 {
490 	if (wpa_s->p2p_mgmt)
491 		return;
492 
493 #ifdef CONFIG_WPS
494 	wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_WPS, id);
495 #endif /* CONFIG_WPS */
496 }
497 
498 
wpas_notify_bss_ies_changed(struct wpa_supplicant * wpa_s,unsigned int id)499 void wpas_notify_bss_ies_changed(struct wpa_supplicant *wpa_s,
500 				   unsigned int id)
501 {
502 	if (wpa_s->p2p_mgmt)
503 		return;
504 
505 	wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_IES, id);
506 }
507 
508 
wpas_notify_bss_rates_changed(struct wpa_supplicant * wpa_s,unsigned int id)509 void wpas_notify_bss_rates_changed(struct wpa_supplicant *wpa_s,
510 				   unsigned int id)
511 {
512 	if (wpa_s->p2p_mgmt)
513 		return;
514 
515 	wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_RATES, id);
516 }
517 
518 
wpas_notify_bss_seen(struct wpa_supplicant * wpa_s,unsigned int id)519 void wpas_notify_bss_seen(struct wpa_supplicant *wpa_s, unsigned int id)
520 {
521 	if (wpa_s->p2p_mgmt)
522 		return;
523 
524 	wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_AGE, id);
525 }
526 
527 
wpas_notify_blob_added(struct wpa_supplicant * wpa_s,const char * name)528 void wpas_notify_blob_added(struct wpa_supplicant *wpa_s, const char *name)
529 {
530 	if (wpa_s->p2p_mgmt)
531 		return;
532 
533 	wpas_dbus_signal_blob_added(wpa_s, name);
534 }
535 
536 
wpas_notify_blob_removed(struct wpa_supplicant * wpa_s,const char * name)537 void wpas_notify_blob_removed(struct wpa_supplicant *wpa_s, const char *name)
538 {
539 	if (wpa_s->p2p_mgmt)
540 		return;
541 
542 	wpas_dbus_signal_blob_removed(wpa_s, name);
543 }
544 
545 
wpas_notify_debug_level_changed(struct wpa_global * global)546 void wpas_notify_debug_level_changed(struct wpa_global *global)
547 {
548 	wpas_dbus_signal_debug_level_changed(global);
549 }
550 
551 
wpas_notify_debug_timestamp_changed(struct wpa_global * global)552 void wpas_notify_debug_timestamp_changed(struct wpa_global *global)
553 {
554 	wpas_dbus_signal_debug_timestamp_changed(global);
555 }
556 
557 
wpas_notify_debug_show_keys_changed(struct wpa_global * global)558 void wpas_notify_debug_show_keys_changed(struct wpa_global *global)
559 {
560 	wpas_dbus_signal_debug_show_keys_changed(global);
561 }
562 
563 
wpas_notify_suspend(struct wpa_global * global)564 void wpas_notify_suspend(struct wpa_global *global)
565 {
566 	struct wpa_supplicant *wpa_s;
567 
568 	os_get_time(&global->suspend_time);
569 	wpa_printf(MSG_DEBUG, "System suspend notification");
570 	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
571 		wpa_drv_suspend(wpa_s);
572 }
573 
574 
wpas_notify_resume(struct wpa_global * global)575 void wpas_notify_resume(struct wpa_global *global)
576 {
577 	struct os_time now;
578 	int slept;
579 	struct wpa_supplicant *wpa_s;
580 
581 	if (global->suspend_time.sec == 0)
582 		slept = -1;
583 	else {
584 		os_get_time(&now);
585 		slept = now.sec - global->suspend_time.sec;
586 	}
587 	wpa_printf(MSG_DEBUG, "System resume notification (slept %d seconds)",
588 		   slept);
589 
590 	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
591 		wpa_drv_resume(wpa_s);
592 		if (wpa_s->wpa_state == WPA_DISCONNECTED)
593 			wpa_supplicant_req_scan(wpa_s, 0, 100000);
594 	}
595 }
596 
597 
598 #ifdef CONFIG_P2P
599 
wpas_notify_p2p_find_stopped(struct wpa_supplicant * wpa_s)600 void wpas_notify_p2p_find_stopped(struct wpa_supplicant *wpa_s)
601 {
602 	/* Notify P2P find has stopped */
603 	wpas_dbus_signal_p2p_find_stopped(wpa_s);
604 
605 	wpas_hidl_notify_p2p_find_stopped(wpa_s);
606 }
607 
608 
wpas_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,int new_device)609 void wpas_notify_p2p_device_found(struct wpa_supplicant *wpa_s,
610 				  const u8 *addr, const struct p2p_peer_info *info,
611 				  const u8* peer_wfd_device_info, u8 peer_wfd_device_info_len,
612 				  int new_device)
613 {
614 	if (new_device) {
615 		/* Create the new peer object */
616 		wpas_dbus_register_peer(wpa_s, info->p2p_device_addr);
617 	}
618 
619 	/* Notify a new peer has been detected*/
620 	wpas_dbus_signal_peer_device_found(wpa_s, info->p2p_device_addr);
621 
622 	wpas_hidl_notify_p2p_device_found(wpa_s, addr, info,
623 					  peer_wfd_device_info,
624 					  peer_wfd_device_info_len);
625 }
626 
627 
wpas_notify_p2p_device_lost(struct wpa_supplicant * wpa_s,const u8 * dev_addr)628 void wpas_notify_p2p_device_lost(struct wpa_supplicant *wpa_s,
629 				 const u8 *dev_addr)
630 {
631 	wpas_dbus_unregister_peer(wpa_s, dev_addr);
632 
633 	/* Create signal on interface object*/
634 	wpas_dbus_signal_peer_device_lost(wpa_s, dev_addr);
635 
636 	wpas_hidl_notify_p2p_device_lost(wpa_s, dev_addr);
637 }
638 
639 
wpas_notify_p2p_group_removed(struct wpa_supplicant * wpa_s,const struct wpa_ssid * ssid,const char * role)640 void wpas_notify_p2p_group_removed(struct wpa_supplicant *wpa_s,
641 				   const struct wpa_ssid *ssid,
642 				   const char *role)
643 {
644 	wpas_dbus_signal_p2p_group_removed(wpa_s, role);
645 
646 	wpas_dbus_unregister_p2p_group(wpa_s, ssid);
647 
648 	wpas_hidl_notify_p2p_group_removed(wpa_s, ssid, role);
649 }
650 
651 
wpas_notify_p2p_go_neg_req(struct wpa_supplicant * wpa_s,const u8 * src,u16 dev_passwd_id,u8 go_intent)652 void wpas_notify_p2p_go_neg_req(struct wpa_supplicant *wpa_s,
653 				const u8 *src, u16 dev_passwd_id, u8 go_intent)
654 {
655 	wpas_dbus_signal_p2p_go_neg_req(wpa_s, src, dev_passwd_id, go_intent);
656 
657 	wpas_hidl_notify_p2p_go_neg_req(wpa_s, src, dev_passwd_id, go_intent);
658 }
659 
660 
wpas_notify_p2p_go_neg_completed(struct wpa_supplicant * wpa_s,struct p2p_go_neg_results * res)661 void wpas_notify_p2p_go_neg_completed(struct wpa_supplicant *wpa_s,
662 				      struct p2p_go_neg_results *res)
663 {
664 	wpas_dbus_signal_p2p_go_neg_resp(wpa_s, res);
665 
666 	wpas_hidl_notify_p2p_go_neg_completed(wpa_s, res);
667 }
668 
669 
wpas_notify_p2p_invitation_result(struct wpa_supplicant * wpa_s,int status,const u8 * bssid)670 void wpas_notify_p2p_invitation_result(struct wpa_supplicant *wpa_s,
671 				       int status, const u8 *bssid)
672 {
673 	wpas_dbus_signal_p2p_invitation_result(wpa_s, status, bssid);
674 
675 	wpas_hidl_notify_p2p_invitation_result(wpa_s, status, bssid);
676 }
677 
678 
wpas_notify_p2p_sd_request(struct wpa_supplicant * wpa_s,int freq,const u8 * sa,u8 dialog_token,u16 update_indic,const u8 * tlvs,size_t tlvs_len)679 void wpas_notify_p2p_sd_request(struct wpa_supplicant *wpa_s,
680 				int freq, const u8 *sa, u8 dialog_token,
681 				u16 update_indic, const u8 *tlvs,
682 				size_t tlvs_len)
683 {
684 	wpas_dbus_signal_p2p_sd_request(wpa_s, freq, sa, dialog_token,
685 					update_indic, tlvs, tlvs_len);
686 }
687 
688 
wpas_notify_p2p_sd_response(struct wpa_supplicant * wpa_s,const u8 * sa,u16 update_indic,const u8 * tlvs,size_t tlvs_len)689 void wpas_notify_p2p_sd_response(struct wpa_supplicant *wpa_s,
690 				 const u8 *sa, u16 update_indic,
691 				 const u8 *tlvs, size_t tlvs_len)
692 {
693 	wpas_dbus_signal_p2p_sd_response(wpa_s, sa, update_indic,
694 					 tlvs, tlvs_len);
695 
696 	wpas_hidl_notify_p2p_sd_response(wpa_s, sa, update_indic,
697 					 tlvs, tlvs_len);
698 }
699 
700 
701 /**
702  * wpas_notify_p2p_provision_discovery - Notification of provision discovery
703  * @dev_addr: Who sent the request or responded to our request.
704  * @request: Will be 1 if request, 0 for response.
705  * @status: Valid only in case of response (0 in case of success)
706  * @config_methods: WPS config methods
707  * @generated_pin: PIN to be displayed in case of WPS_CONFIG_DISPLAY method
708  *
709  * This can be used to notify:
710  * - Requests or responses
711  * - Various config methods
712  * - Failure condition in case of response
713  */
wpas_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)714 void wpas_notify_p2p_provision_discovery(struct wpa_supplicant *wpa_s,
715 					 const u8 *dev_addr, int request,
716 					 enum p2p_prov_disc_status status,
717 					 u16 config_methods,
718 					 unsigned int generated_pin)
719 {
720 	wpas_dbus_signal_p2p_provision_discovery(wpa_s, dev_addr, request,
721 						 status, config_methods,
722 						 generated_pin);
723 
724 	wpas_hidl_notify_p2p_provision_discovery(wpa_s, dev_addr, request,
725 						 status, config_methods,
726 						 generated_pin);
727 
728 }
729 
730 
wpas_notify_p2p_group_started(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid,int persistent,int client,const u8 * ip)731 void wpas_notify_p2p_group_started(struct wpa_supplicant *wpa_s,
732 				   struct wpa_ssid *ssid, int persistent,
733 				   int client, const u8 *ip)
734 {
735 	/* Notify a group has been started */
736 	wpas_dbus_register_p2p_group(wpa_s, ssid);
737 
738 	wpas_dbus_signal_p2p_group_started(wpa_s, client, persistent, ip);
739 
740 	wpas_hidl_notify_p2p_group_started(wpa_s, ssid, persistent, client);
741 }
742 
743 
wpas_notify_p2p_group_formation_failure(struct wpa_supplicant * wpa_s,const char * reason)744 void wpas_notify_p2p_group_formation_failure(struct wpa_supplicant *wpa_s,
745 					     const char *reason)
746 {
747 	/* Notify a group formation failed */
748 	wpas_dbus_signal_p2p_group_formation_failure(wpa_s, reason);
749 
750 	wpas_hidl_notify_p2p_group_formation_failure(wpa_s, reason);
751 }
752 
753 
wpas_notify_p2p_wps_failed(struct wpa_supplicant * wpa_s,struct wps_event_fail * fail)754 void wpas_notify_p2p_wps_failed(struct wpa_supplicant *wpa_s,
755 				struct wps_event_fail *fail)
756 {
757 	wpas_dbus_signal_p2p_wps_failed(wpa_s, fail);
758 }
759 
760 
wpas_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)761 void wpas_notify_p2p_invitation_received(struct wpa_supplicant *wpa_s,
762 					 const u8 *sa, const u8 *go_dev_addr,
763 					 const u8 *bssid, int id, int op_freq)
764 {
765 	/* Notify a P2P Invitation Request */
766 	wpas_dbus_signal_p2p_invitation_received(wpa_s, sa, go_dev_addr, bssid,
767 						 id, op_freq);
768 
769 	wpas_hidl_notify_p2p_invitation_received(wpa_s, sa, go_dev_addr, bssid,
770 						 id, op_freq);
771 }
772 
773 #endif /* CONFIG_P2P */
774 
775 
wpas_notify_ap_sta_authorized(struct wpa_supplicant * wpa_s,const u8 * sta,const u8 * p2p_dev_addr)776 static void wpas_notify_ap_sta_authorized(struct wpa_supplicant *wpa_s,
777 					  const u8 *sta,
778 					  const u8 *p2p_dev_addr)
779 {
780 #ifdef CONFIG_P2P
781 	wpas_p2p_notify_ap_sta_authorized(wpa_s, p2p_dev_addr);
782 
783 	/*
784 	 * Create 'peer-joined' signal on group object -- will also
785 	 * check P2P itself.
786 	 */
787 	if (p2p_dev_addr)
788 		wpas_dbus_signal_p2p_peer_joined(wpa_s, p2p_dev_addr);
789 #endif /* CONFIG_P2P */
790 
791 	/* Notify listeners a new station has been authorized */
792 	wpas_dbus_signal_sta_authorized(wpa_s, sta);
793 
794 	wpas_hidl_notify_ap_sta_authorized(wpa_s, sta, p2p_dev_addr);
795 }
796 
797 
wpas_notify_ap_sta_deauthorized(struct wpa_supplicant * wpa_s,const u8 * sta,const u8 * p2p_dev_addr)798 static void wpas_notify_ap_sta_deauthorized(struct wpa_supplicant *wpa_s,
799 					    const u8 *sta,
800 					    const u8 *p2p_dev_addr)
801 {
802 #ifdef CONFIG_P2P
803 	/*
804 	 * Create 'peer-disconnected' signal on group object if this
805 	 * is a P2P group.
806 	 */
807 	if (p2p_dev_addr)
808 		wpas_dbus_signal_p2p_peer_disconnected(wpa_s, p2p_dev_addr);
809 #endif /* CONFIG_P2P */
810 
811 	/* Notify listeners a station has been deauthorized */
812 	wpas_dbus_signal_sta_deauthorized(wpa_s, sta);
813 
814 	wpas_hidl_notify_ap_sta_deauthorized(wpa_s, sta, p2p_dev_addr);
815 }
816 
817 
wpas_notify_sta_authorized(struct wpa_supplicant * wpa_s,const u8 * mac_addr,int authorized,const u8 * p2p_dev_addr)818 void wpas_notify_sta_authorized(struct wpa_supplicant *wpa_s,
819 				const u8 *mac_addr, int authorized,
820 				const u8 *p2p_dev_addr)
821 {
822 	if (authorized)
823 		wpas_notify_ap_sta_authorized(wpa_s, mac_addr, p2p_dev_addr);
824 	else
825 		wpas_notify_ap_sta_deauthorized(wpa_s, mac_addr, p2p_dev_addr);
826 }
827 
828 
wpas_notify_certification(struct wpa_supplicant * wpa_s,int depth,const char * subject,const char * altsubject[],int num_altsubject,const char * cert_hash,const struct wpabuf * cert)829 void wpas_notify_certification(struct wpa_supplicant *wpa_s, int depth,
830 			       const char *subject, const char *altsubject[],
831 			       int num_altsubject, const char *cert_hash,
832 			       const struct wpabuf *cert)
833 {
834 	wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_EAP_PEER_CERT
835 		"depth=%d subject='%s'%s%s",
836 		depth, subject, cert_hash ? " hash=" : "",
837 		cert_hash ? cert_hash : "");
838 
839 	if (cert) {
840 		char *cert_hex;
841 		size_t len = wpabuf_len(cert) * 2 + 1;
842 		cert_hex = os_malloc(len);
843 		if (cert_hex) {
844 			wpa_snprintf_hex(cert_hex, len, wpabuf_head(cert),
845 					 wpabuf_len(cert));
846 			wpa_msg_ctrl(wpa_s, MSG_INFO,
847 				     WPA_EVENT_EAP_PEER_CERT
848 				     "depth=%d subject='%s' cert=%s",
849 				     depth, subject, cert_hex);
850 			os_free(cert_hex);
851 		}
852 	}
853 
854 	if (altsubject) {
855 		int i;
856 
857 		for (i = 0; i < num_altsubject; i++)
858 			wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_EAP_PEER_ALT
859 				"depth=%d %s", depth, altsubject[i]);
860 	}
861 
862 	/* notify the old DBus API */
863 	wpa_supplicant_dbus_notify_certification(wpa_s, depth, subject,
864 						 cert_hash, cert);
865 	/* notify the new DBus API */
866 	wpas_dbus_signal_certification(wpa_s, depth, subject, altsubject,
867 				       num_altsubject, cert_hash, cert);
868 }
869 
870 
wpas_notify_preq(struct wpa_supplicant * wpa_s,const u8 * addr,const u8 * dst,const u8 * bssid,const u8 * ie,size_t ie_len,u32 ssi_signal)871 void wpas_notify_preq(struct wpa_supplicant *wpa_s,
872 		      const u8 *addr, const u8 *dst, const u8 *bssid,
873 		      const u8 *ie, size_t ie_len, u32 ssi_signal)
874 {
875 #ifdef CONFIG_AP
876 	wpas_dbus_signal_preq(wpa_s, addr, dst, bssid, ie, ie_len, ssi_signal);
877 #endif /* CONFIG_AP */
878 }
879 
880 
wpas_notify_eap_status(struct wpa_supplicant * wpa_s,const char * status,const char * parameter)881 void wpas_notify_eap_status(struct wpa_supplicant *wpa_s, const char *status,
882 			    const char *parameter)
883 {
884 	wpas_dbus_signal_eap_status(wpa_s, status, parameter);
885 	wpa_msg_ctrl(wpa_s, MSG_INFO, WPA_EVENT_EAP_STATUS
886 		     "status='%s' parameter='%s'",
887 		     status, parameter);
888 }
889 
wpas_notify_eap_error(struct wpa_supplicant * wpa_s,int error_code)890 void wpas_notify_eap_error(struct wpa_supplicant *wpa_s, int error_code)
891 {
892 	wpa_dbg(wpa_s, MSG_ERROR,
893 		"EAP Error code = %d", error_code);
894 	wpas_hidl_notify_eap_error(wpa_s, error_code);
895 }
896 
wpas_notify_network_bssid_set_changed(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)897 void wpas_notify_network_bssid_set_changed(struct wpa_supplicant *wpa_s,
898 					   struct wpa_ssid *ssid)
899 {
900 	if (wpa_s->current_ssid != ssid)
901 		return;
902 
903 	wpa_dbg(wpa_s, MSG_DEBUG,
904 		"Network bssid config changed for the current network - within-ESS roaming %s",
905 		ssid->bssid_set ? "disabled" : "enabled");
906 
907 	wpa_drv_roaming(wpa_s, !ssid->bssid_set,
908 			ssid->bssid_set ? ssid->bssid : NULL);
909 }
910 
911 
wpas_notify_network_type_changed(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)912 void wpas_notify_network_type_changed(struct wpa_supplicant *wpa_s,
913 				      struct wpa_ssid *ssid)
914 {
915 #ifdef CONFIG_P2P
916 	if (ssid->disabled == 2) {
917 		/* Changed from normal network profile to persistent group */
918 		ssid->disabled = 0;
919 		wpas_dbus_unregister_network(wpa_s, ssid->id);
920 		ssid->disabled = 2;
921 		ssid->p2p_persistent_group = 1;
922 		wpas_dbus_register_persistent_group(wpa_s, ssid);
923 	} else {
924 		/* Changed from persistent group to normal network profile */
925 		wpas_dbus_unregister_persistent_group(wpa_s, ssid->id);
926 		ssid->p2p_persistent_group = 0;
927 		wpas_dbus_register_network(wpa_s, ssid);
928 	}
929 #endif /* CONFIG_P2P */
930 }
931 
wpas_notify_anqp_query_done(struct wpa_supplicant * wpa_s,const u8 * bssid,const char * result,const struct wpa_bss_anqp * anqp)932 void wpas_notify_anqp_query_done(struct wpa_supplicant *wpa_s, const u8* bssid,
933 				 const char *result,
934 				 const struct wpa_bss_anqp *anqp)
935 {
936 #ifdef CONFIG_INTERWORKING
937 	if (!wpa_s || !bssid || !anqp)
938 		return;
939 
940 	wpas_hidl_notify_anqp_query_done(wpa_s, bssid, result, anqp);
941 #endif /* CONFIG_INTERWORKING */
942 }
943 
wpas_notify_hs20_icon_query_done(struct wpa_supplicant * wpa_s,const u8 * bssid,const char * file_name,const u8 * image,u32 image_length)944 void wpas_notify_hs20_icon_query_done(struct wpa_supplicant *wpa_s, const u8* bssid,
945 				      const char* file_name, const u8* image,
946 				      u32 image_length)
947 {
948 #ifdef CONFIG_HS20
949 	if (!wpa_s || !bssid || !file_name || !image)
950 		return;
951 
952 	wpas_hidl_notify_hs20_icon_query_done(wpa_s, bssid, file_name, image,
953 					      image_length);
954 #endif /* CONFIG_HS20 */
955 }
956 
wpas_notify_hs20_rx_subscription_remediation(struct wpa_supplicant * wpa_s,const char * url,u8 osu_method)957 void wpas_notify_hs20_rx_subscription_remediation(struct wpa_supplicant *wpa_s,
958 						  const char* url,
959 						  u8 osu_method)
960 {
961 #ifdef CONFIG_HS20
962 	if (!wpa_s || !url)
963 		return;
964 
965 	wpas_hidl_notify_hs20_rx_subscription_remediation(wpa_s, url, osu_method);
966 #endif /* CONFIG_HS20 */
967 }
968 
wpas_notify_hs20_rx_deauth_imminent_notice(struct wpa_supplicant * wpa_s,u8 code,u16 reauth_delay,const char * url)969 void wpas_notify_hs20_rx_deauth_imminent_notice(struct wpa_supplicant *wpa_s,
970 						u8 code, u16 reauth_delay,
971 						const char *url)
972 {
973 #ifdef CONFIG_HS20
974 	if (!wpa_s || !url)
975 		return;
976 
977 	wpas_hidl_notify_hs20_rx_deauth_imminent_notice(wpa_s, code, reauth_delay,
978 							url);
979 #endif /* CONFIG_HS20 */
980 }
981 
982 
983 #ifdef CONFIG_MESH
984 
wpas_notify_mesh_group_started(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)985 void wpas_notify_mesh_group_started(struct wpa_supplicant *wpa_s,
986 				    struct wpa_ssid *ssid)
987 {
988 	if (wpa_s->p2p_mgmt)
989 		return;
990 
991 	wpas_dbus_signal_mesh_group_started(wpa_s, ssid);
992 }
993 
994 
wpas_notify_mesh_group_removed(struct wpa_supplicant * wpa_s,const u8 * meshid,u8 meshid_len,int reason_code)995 void wpas_notify_mesh_group_removed(struct wpa_supplicant *wpa_s,
996 				    const u8 *meshid, u8 meshid_len,
997 				    int reason_code)
998 {
999 	if (wpa_s->p2p_mgmt)
1000 		return;
1001 
1002 	wpas_dbus_signal_mesh_group_removed(wpa_s, meshid, meshid_len,
1003 					    reason_code);
1004 }
1005 
1006 
wpas_notify_mesh_peer_connected(struct wpa_supplicant * wpa_s,const u8 * peer_addr)1007 void wpas_notify_mesh_peer_connected(struct wpa_supplicant *wpa_s,
1008 				     const u8 *peer_addr)
1009 {
1010 	if (wpa_s->p2p_mgmt)
1011 		return;
1012 
1013 	wpas_dbus_signal_mesh_peer_connected(wpa_s, peer_addr);
1014 }
1015 
1016 
wpas_notify_mesh_peer_disconnected(struct wpa_supplicant * wpa_s,const u8 * peer_addr,int reason_code)1017 void wpas_notify_mesh_peer_disconnected(struct wpa_supplicant *wpa_s,
1018 					const u8 *peer_addr, int reason_code)
1019 {
1020 	if (wpa_s->p2p_mgmt)
1021 		return;
1022 
1023 	wpas_dbus_signal_mesh_peer_disconnected(wpa_s, peer_addr, reason_code);
1024 }
1025 
1026 #endif /* CONFIG_MESH */
1027