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 "binder/binder.h"
17 #include "dbus/dbus_common.h"
18 #include "dbus/dbus_old.h"
19 #include "dbus/dbus_new.h"
20 #include "rsn_supp/wpa.h"
21 #include "fst/fst.h"
22 #include "driver_i.h"
23 #include "scan.h"
24 #include "p2p_supplicant.h"
25 #include "sme.h"
26 #include "notify.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_BINDER
39 	global->binder = wpas_binder_init(global);
40 	if (!global->binder)
41 		return -1;
42 #endif /* CONFIG_BINDER */
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_BINDER
56 	if (global->binder)
57 		wpas_binder_deinit(global->binder);
58 #endif /* CONFIG_BINDER */
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 		return 0;
66 
67 	if (wpas_dbus_register_iface(wpa_s))
68 		return -1;
69 
70 	if (wpas_dbus_register_interface(wpa_s))
71 		return -1;
72 
73 	return 0;
74 }
75 
76 
wpas_notify_iface_removed(struct wpa_supplicant * wpa_s)77 void wpas_notify_iface_removed(struct wpa_supplicant *wpa_s)
78 {
79 	if (wpa_s->p2p_mgmt)
80 		return;
81 
82 	/* unregister interface in old DBus ctrl iface */
83 	wpas_dbus_unregister_iface(wpa_s);
84 
85 	/* unregister interface in new DBus ctrl iface */
86 	wpas_dbus_unregister_interface(wpa_s);
87 }
88 
89 
wpas_notify_state_changed(struct wpa_supplicant * wpa_s,enum wpa_states new_state,enum wpa_states old_state)90 void wpas_notify_state_changed(struct wpa_supplicant *wpa_s,
91 			       enum wpa_states new_state,
92 			       enum wpa_states old_state)
93 {
94 	if (wpa_s->p2p_mgmt)
95 		return;
96 
97 	/* notify the old DBus API */
98 	wpa_supplicant_dbus_notify_state_change(wpa_s, new_state,
99 						old_state);
100 
101 	/* notify the new DBus API */
102 	wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_STATE);
103 
104 #ifdef CONFIG_FST
105 	if (wpa_s->fst && !is_zero_ether_addr(wpa_s->bssid)) {
106 		if (new_state == WPA_COMPLETED)
107 			fst_notify_peer_connected(wpa_s->fst, wpa_s->bssid);
108 		else if (old_state >= WPA_ASSOCIATED &&
109 			 new_state < WPA_ASSOCIATED)
110 			fst_notify_peer_disconnected(wpa_s->fst, wpa_s->bssid);
111 	}
112 #endif /* CONFIG_FST */
113 
114 	if (new_state == WPA_COMPLETED)
115 		wpas_p2p_notif_connected(wpa_s);
116 	else if (old_state >= WPA_ASSOCIATED && new_state < WPA_ASSOCIATED)
117 		wpas_p2p_notif_disconnected(wpa_s);
118 
119 	sme_state_changed(wpa_s);
120 
121 #ifdef ANDROID
122 	wpa_msg_ctrl(wpa_s, MSG_INFO, WPA_EVENT_STATE_CHANGE
123 		     "id=%d state=%d BSSID=" MACSTR " SSID=%s",
124 		     wpa_s->current_ssid ? wpa_s->current_ssid->id : -1,
125 		     new_state,
126 		     MAC2STR(wpa_s->bssid),
127 		     wpa_s->current_ssid && wpa_s->current_ssid->ssid ?
128 		     wpa_ssid_txt(wpa_s->current_ssid->ssid,
129 				  wpa_s->current_ssid->ssid_len) : "");
130 #endif /* ANDROID */
131 }
132 
133 
wpas_notify_disconnect_reason(struct wpa_supplicant * wpa_s)134 void wpas_notify_disconnect_reason(struct wpa_supplicant *wpa_s)
135 {
136 	if (wpa_s->p2p_mgmt)
137 		return;
138 
139 	wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_DISCONNECT_REASON);
140 }
141 
142 
wpas_notify_assoc_status_code(struct wpa_supplicant * wpa_s)143 void wpas_notify_assoc_status_code(struct wpa_supplicant *wpa_s)
144 {
145 	if (wpa_s->p2p_mgmt)
146 		return;
147 
148 	wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_ASSOC_STATUS_CODE);
149 }
150 
151 
wpas_notify_network_changed(struct wpa_supplicant * wpa_s)152 void wpas_notify_network_changed(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_CURRENT_NETWORK);
158 }
159 
160 
wpas_notify_ap_scan_changed(struct wpa_supplicant * wpa_s)161 void wpas_notify_ap_scan_changed(struct wpa_supplicant *wpa_s)
162 {
163 	if (wpa_s->p2p_mgmt)
164 		return;
165 
166 	wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_AP_SCAN);
167 }
168 
169 
wpas_notify_bssid_changed(struct wpa_supplicant * wpa_s)170 void wpas_notify_bssid_changed(struct wpa_supplicant *wpa_s)
171 {
172 	if (wpa_s->p2p_mgmt)
173 		return;
174 
175 	wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_CURRENT_BSS);
176 }
177 
178 
wpas_notify_auth_changed(struct wpa_supplicant * wpa_s)179 void wpas_notify_auth_changed(struct wpa_supplicant *wpa_s)
180 {
181 	if (wpa_s->p2p_mgmt)
182 		return;
183 
184 	wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_CURRENT_AUTH_MODE);
185 }
186 
187 
wpas_notify_network_enabled_changed(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)188 void wpas_notify_network_enabled_changed(struct wpa_supplicant *wpa_s,
189 					 struct wpa_ssid *ssid)
190 {
191 	if (wpa_s->p2p_mgmt)
192 		return;
193 
194 	wpas_dbus_signal_network_enabled_changed(wpa_s, ssid);
195 }
196 
197 
wpas_notify_network_selected(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)198 void wpas_notify_network_selected(struct wpa_supplicant *wpa_s,
199 				  struct wpa_ssid *ssid)
200 {
201 	if (wpa_s->p2p_mgmt)
202 		return;
203 
204 	wpas_dbus_signal_network_selected(wpa_s, ssid->id);
205 }
206 
207 
wpas_notify_network_request(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid,enum wpa_ctrl_req_type rtype,const char * default_txt)208 void wpas_notify_network_request(struct wpa_supplicant *wpa_s,
209 				 struct wpa_ssid *ssid,
210 				 enum wpa_ctrl_req_type rtype,
211 				 const char *default_txt)
212 {
213 	if (wpa_s->p2p_mgmt)
214 		return;
215 
216 	wpas_dbus_signal_network_request(wpa_s, ssid, rtype, default_txt);
217 }
218 
219 
wpas_notify_scanning(struct wpa_supplicant * wpa_s)220 void wpas_notify_scanning(struct wpa_supplicant *wpa_s)
221 {
222 	if (wpa_s->p2p_mgmt)
223 		return;
224 
225 	/* notify the old DBus API */
226 	wpa_supplicant_dbus_notify_scanning(wpa_s);
227 
228 	/* notify the new DBus API */
229 	wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_SCANNING);
230 }
231 
232 
wpas_notify_scan_done(struct wpa_supplicant * wpa_s,int success)233 void wpas_notify_scan_done(struct wpa_supplicant *wpa_s, int success)
234 {
235 	if (wpa_s->p2p_mgmt)
236 		return;
237 
238 	wpas_dbus_signal_scan_done(wpa_s, success);
239 }
240 
241 
wpas_notify_scan_results(struct wpa_supplicant * wpa_s)242 void wpas_notify_scan_results(struct wpa_supplicant *wpa_s)
243 {
244 	if (wpa_s->p2p_mgmt)
245 		return;
246 
247 	/* notify the old DBus API */
248 	wpa_supplicant_dbus_notify_scan_results(wpa_s);
249 
250 	wpas_wps_notify_scan_results(wpa_s);
251 }
252 
253 
wpas_notify_wps_credential(struct wpa_supplicant * wpa_s,const struct wps_credential * cred)254 void wpas_notify_wps_credential(struct wpa_supplicant *wpa_s,
255 				const struct wps_credential *cred)
256 {
257 	if (wpa_s->p2p_mgmt)
258 		return;
259 
260 #ifdef CONFIG_WPS
261 	/* notify the old DBus API */
262 	wpa_supplicant_dbus_notify_wps_cred(wpa_s, cred);
263 	/* notify the new DBus API */
264 	wpas_dbus_signal_wps_cred(wpa_s, cred);
265 #endif /* CONFIG_WPS */
266 }
267 
268 
wpas_notify_wps_event_m2d(struct wpa_supplicant * wpa_s,struct wps_event_m2d * m2d)269 void wpas_notify_wps_event_m2d(struct wpa_supplicant *wpa_s,
270 			       struct wps_event_m2d *m2d)
271 {
272 	if (wpa_s->p2p_mgmt)
273 		return;
274 
275 #ifdef CONFIG_WPS
276 	wpas_dbus_signal_wps_event_m2d(wpa_s, m2d);
277 #endif /* CONFIG_WPS */
278 }
279 
280 
wpas_notify_wps_event_fail(struct wpa_supplicant * wpa_s,struct wps_event_fail * fail)281 void wpas_notify_wps_event_fail(struct wpa_supplicant *wpa_s,
282 				struct wps_event_fail *fail)
283 {
284 	if (wpa_s->p2p_mgmt)
285 		return;
286 
287 #ifdef CONFIG_WPS
288 	wpas_dbus_signal_wps_event_fail(wpa_s, fail);
289 #endif /* CONFIG_WPS */
290 }
291 
292 
wpas_notify_wps_event_success(struct wpa_supplicant * wpa_s)293 void wpas_notify_wps_event_success(struct wpa_supplicant *wpa_s)
294 {
295 	if (wpa_s->p2p_mgmt)
296 		return;
297 
298 #ifdef CONFIG_WPS
299 	wpas_dbus_signal_wps_event_success(wpa_s);
300 #endif /* CONFIG_WPS */
301 }
302 
wpas_notify_wps_event_pbc_overlap(struct wpa_supplicant * wpa_s)303 void wpas_notify_wps_event_pbc_overlap(struct wpa_supplicant *wpa_s)
304 {
305 	if (wpa_s->p2p_mgmt)
306 		return;
307 
308 #ifdef CONFIG_WPS
309 	wpas_dbus_signal_wps_event_pbc_overlap(wpa_s);
310 #endif /* CONFIG_WPS */
311 }
312 
313 
wpas_notify_network_added(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)314 void wpas_notify_network_added(struct wpa_supplicant *wpa_s,
315 			       struct wpa_ssid *ssid)
316 {
317 	if (wpa_s->p2p_mgmt)
318 		return;
319 
320 	/*
321 	 * Networks objects created during any P2P activities should not be
322 	 * exposed out. They might/will confuse certain non-P2P aware
323 	 * applications since these network objects won't behave like
324 	 * regular ones.
325 	 */
326 	if (!ssid->p2p_group && wpa_s->global->p2p_group_formation != wpa_s)
327 		wpas_dbus_register_network(wpa_s, ssid);
328 }
329 
330 
wpas_notify_persistent_group_added(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)331 void wpas_notify_persistent_group_added(struct wpa_supplicant *wpa_s,
332 					struct wpa_ssid *ssid)
333 {
334 #ifdef CONFIG_P2P
335 	wpas_dbus_register_persistent_group(wpa_s, ssid);
336 #endif /* CONFIG_P2P */
337 }
338 
339 
wpas_notify_persistent_group_removed(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)340 void wpas_notify_persistent_group_removed(struct wpa_supplicant *wpa_s,
341 					  struct wpa_ssid *ssid)
342 {
343 #ifdef CONFIG_P2P
344 	wpas_dbus_unregister_persistent_group(wpa_s, ssid->id);
345 #endif /* CONFIG_P2P */
346 }
347 
348 
wpas_notify_network_removed(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)349 void wpas_notify_network_removed(struct wpa_supplicant *wpa_s,
350 				 struct wpa_ssid *ssid)
351 {
352 	if (wpa_s->next_ssid == ssid)
353 		wpa_s->next_ssid = NULL;
354 	if (wpa_s->wpa)
355 		wpa_sm_pmksa_cache_flush(wpa_s->wpa, ssid);
356 	if (!ssid->p2p_group && wpa_s->global->p2p_group_formation != wpa_s &&
357 	    !wpa_s->p2p_mgmt)
358 		wpas_dbus_unregister_network(wpa_s, ssid->id);
359 	if (network_is_persistent_group(ssid))
360 		wpas_notify_persistent_group_removed(wpa_s, ssid);
361 
362 	wpas_p2p_network_removed(wpa_s, ssid);
363 }
364 
365 
wpas_notify_bss_added(struct wpa_supplicant * wpa_s,u8 bssid[],unsigned int id)366 void wpas_notify_bss_added(struct wpa_supplicant *wpa_s,
367 			   u8 bssid[], unsigned int id)
368 {
369 	if (wpa_s->p2p_mgmt)
370 		return;
371 
372 	wpas_dbus_register_bss(wpa_s, bssid, id);
373 	wpa_msg_ctrl(wpa_s, MSG_INFO, WPA_EVENT_BSS_ADDED "%u " MACSTR,
374 		     id, MAC2STR(bssid));
375 }
376 
377 
wpas_notify_bss_removed(struct wpa_supplicant * wpa_s,u8 bssid[],unsigned int id)378 void wpas_notify_bss_removed(struct wpa_supplicant *wpa_s,
379 			     u8 bssid[], unsigned int id)
380 {
381 	if (wpa_s->p2p_mgmt)
382 		return;
383 
384 	wpas_dbus_unregister_bss(wpa_s, bssid, id);
385 	wpa_msg_ctrl(wpa_s, MSG_INFO, WPA_EVENT_BSS_REMOVED "%u " MACSTR,
386 		     id, MAC2STR(bssid));
387 }
388 
389 
wpas_notify_bss_freq_changed(struct wpa_supplicant * wpa_s,unsigned int id)390 void wpas_notify_bss_freq_changed(struct wpa_supplicant *wpa_s,
391 				  unsigned int id)
392 {
393 	if (wpa_s->p2p_mgmt)
394 		return;
395 
396 	wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_FREQ, id);
397 }
398 
399 
wpas_notify_bss_signal_changed(struct wpa_supplicant * wpa_s,unsigned int id)400 void wpas_notify_bss_signal_changed(struct wpa_supplicant *wpa_s,
401 				    unsigned int id)
402 {
403 	if (wpa_s->p2p_mgmt)
404 		return;
405 
406 	wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_SIGNAL,
407 					  id);
408 }
409 
410 
wpas_notify_bss_privacy_changed(struct wpa_supplicant * wpa_s,unsigned int id)411 void wpas_notify_bss_privacy_changed(struct wpa_supplicant *wpa_s,
412 				     unsigned int id)
413 {
414 	if (wpa_s->p2p_mgmt)
415 		return;
416 
417 	wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_PRIVACY,
418 					  id);
419 }
420 
421 
wpas_notify_bss_mode_changed(struct wpa_supplicant * wpa_s,unsigned int id)422 void wpas_notify_bss_mode_changed(struct wpa_supplicant *wpa_s,
423 				  unsigned int id)
424 {
425 	if (wpa_s->p2p_mgmt)
426 		return;
427 
428 	wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_MODE, id);
429 }
430 
431 
wpas_notify_bss_wpaie_changed(struct wpa_supplicant * wpa_s,unsigned int id)432 void wpas_notify_bss_wpaie_changed(struct wpa_supplicant *wpa_s,
433 				   unsigned int id)
434 {
435 	if (wpa_s->p2p_mgmt)
436 		return;
437 
438 	wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_WPA, id);
439 }
440 
441 
wpas_notify_bss_rsnie_changed(struct wpa_supplicant * wpa_s,unsigned int id)442 void wpas_notify_bss_rsnie_changed(struct wpa_supplicant *wpa_s,
443 				   unsigned int id)
444 {
445 	if (wpa_s->p2p_mgmt)
446 		return;
447 
448 	wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_RSN, id);
449 }
450 
451 
wpas_notify_bss_wps_changed(struct wpa_supplicant * wpa_s,unsigned int id)452 void wpas_notify_bss_wps_changed(struct wpa_supplicant *wpa_s,
453 				 unsigned int id)
454 {
455 	if (wpa_s->p2p_mgmt)
456 		return;
457 
458 #ifdef CONFIG_WPS
459 	wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_WPS, id);
460 #endif /* CONFIG_WPS */
461 }
462 
463 
wpas_notify_bss_ies_changed(struct wpa_supplicant * wpa_s,unsigned int id)464 void wpas_notify_bss_ies_changed(struct wpa_supplicant *wpa_s,
465 				   unsigned int id)
466 {
467 	if (wpa_s->p2p_mgmt)
468 		return;
469 
470 	wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_IES, id);
471 }
472 
473 
wpas_notify_bss_rates_changed(struct wpa_supplicant * wpa_s,unsigned int id)474 void wpas_notify_bss_rates_changed(struct wpa_supplicant *wpa_s,
475 				   unsigned int id)
476 {
477 	if (wpa_s->p2p_mgmt)
478 		return;
479 
480 	wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_RATES, id);
481 }
482 
483 
wpas_notify_bss_seen(struct wpa_supplicant * wpa_s,unsigned int id)484 void wpas_notify_bss_seen(struct wpa_supplicant *wpa_s, unsigned int id)
485 {
486 	if (wpa_s->p2p_mgmt)
487 		return;
488 
489 	wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_AGE, id);
490 }
491 
492 
wpas_notify_blob_added(struct wpa_supplicant * wpa_s,const char * name)493 void wpas_notify_blob_added(struct wpa_supplicant *wpa_s, const char *name)
494 {
495 	if (wpa_s->p2p_mgmt)
496 		return;
497 
498 	wpas_dbus_signal_blob_added(wpa_s, name);
499 }
500 
501 
wpas_notify_blob_removed(struct wpa_supplicant * wpa_s,const char * name)502 void wpas_notify_blob_removed(struct wpa_supplicant *wpa_s, const char *name)
503 {
504 	if (wpa_s->p2p_mgmt)
505 		return;
506 
507 	wpas_dbus_signal_blob_removed(wpa_s, name);
508 }
509 
510 
wpas_notify_debug_level_changed(struct wpa_global * global)511 void wpas_notify_debug_level_changed(struct wpa_global *global)
512 {
513 	wpas_dbus_signal_debug_level_changed(global);
514 }
515 
516 
wpas_notify_debug_timestamp_changed(struct wpa_global * global)517 void wpas_notify_debug_timestamp_changed(struct wpa_global *global)
518 {
519 	wpas_dbus_signal_debug_timestamp_changed(global);
520 }
521 
522 
wpas_notify_debug_show_keys_changed(struct wpa_global * global)523 void wpas_notify_debug_show_keys_changed(struct wpa_global *global)
524 {
525 	wpas_dbus_signal_debug_show_keys_changed(global);
526 }
527 
528 
wpas_notify_suspend(struct wpa_global * global)529 void wpas_notify_suspend(struct wpa_global *global)
530 {
531 	struct wpa_supplicant *wpa_s;
532 
533 	os_get_time(&global->suspend_time);
534 	wpa_printf(MSG_DEBUG, "System suspend notification");
535 	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
536 		wpa_drv_suspend(wpa_s);
537 }
538 
539 
wpas_notify_resume(struct wpa_global * global)540 void wpas_notify_resume(struct wpa_global *global)
541 {
542 	struct os_time now;
543 	int slept;
544 	struct wpa_supplicant *wpa_s;
545 
546 	if (global->suspend_time.sec == 0)
547 		slept = -1;
548 	else {
549 		os_get_time(&now);
550 		slept = now.sec - global->suspend_time.sec;
551 	}
552 	wpa_printf(MSG_DEBUG, "System resume notification (slept %d seconds)",
553 		   slept);
554 
555 	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
556 		wpa_drv_resume(wpa_s);
557 		if (wpa_s->wpa_state == WPA_DISCONNECTED)
558 			wpa_supplicant_req_scan(wpa_s, 0, 100000);
559 	}
560 }
561 
562 
563 #ifdef CONFIG_P2P
564 
wpas_notify_p2p_find_stopped(struct wpa_supplicant * wpa_s)565 void wpas_notify_p2p_find_stopped(struct wpa_supplicant *wpa_s)
566 {
567 	/* Notify P2P find has stopped */
568 	wpas_dbus_signal_p2p_find_stopped(wpa_s);
569 }
570 
571 
wpas_notify_p2p_device_found(struct wpa_supplicant * wpa_s,const u8 * dev_addr,int new_device)572 void wpas_notify_p2p_device_found(struct wpa_supplicant *wpa_s,
573 				  const u8 *dev_addr, int new_device)
574 {
575 	if (new_device) {
576 		/* Create the new peer object */
577 		wpas_dbus_register_peer(wpa_s, dev_addr);
578 	}
579 
580 	/* Notify a new peer has been detected*/
581 	wpas_dbus_signal_peer_device_found(wpa_s, dev_addr);
582 }
583 
584 
wpas_notify_p2p_device_lost(struct wpa_supplicant * wpa_s,const u8 * dev_addr)585 void wpas_notify_p2p_device_lost(struct wpa_supplicant *wpa_s,
586 				 const u8 *dev_addr)
587 {
588 	wpas_dbus_unregister_peer(wpa_s, dev_addr);
589 
590 	/* Create signal on interface object*/
591 	wpas_dbus_signal_peer_device_lost(wpa_s, dev_addr);
592 }
593 
594 
wpas_notify_p2p_group_removed(struct wpa_supplicant * wpa_s,const struct wpa_ssid * ssid,const char * role)595 void wpas_notify_p2p_group_removed(struct wpa_supplicant *wpa_s,
596 				   const struct wpa_ssid *ssid,
597 				   const char *role)
598 {
599 	wpas_dbus_signal_p2p_group_removed(wpa_s, role);
600 
601 	wpas_dbus_unregister_p2p_group(wpa_s, ssid);
602 }
603 
604 
wpas_notify_p2p_go_neg_req(struct wpa_supplicant * wpa_s,const u8 * src,u16 dev_passwd_id,u8 go_intent)605 void wpas_notify_p2p_go_neg_req(struct wpa_supplicant *wpa_s,
606 				const u8 *src, u16 dev_passwd_id, u8 go_intent)
607 {
608 	wpas_dbus_signal_p2p_go_neg_req(wpa_s, src, dev_passwd_id, go_intent);
609 }
610 
611 
wpas_notify_p2p_go_neg_completed(struct wpa_supplicant * wpa_s,struct p2p_go_neg_results * res)612 void wpas_notify_p2p_go_neg_completed(struct wpa_supplicant *wpa_s,
613 				      struct p2p_go_neg_results *res)
614 {
615 	wpas_dbus_signal_p2p_go_neg_resp(wpa_s, res);
616 }
617 
618 
wpas_notify_p2p_invitation_result(struct wpa_supplicant * wpa_s,int status,const u8 * bssid)619 void wpas_notify_p2p_invitation_result(struct wpa_supplicant *wpa_s,
620 				       int status, const u8 *bssid)
621 {
622 	wpas_dbus_signal_p2p_invitation_result(wpa_s, status, bssid);
623 }
624 
625 
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)626 void wpas_notify_p2p_sd_request(struct wpa_supplicant *wpa_s,
627 				int freq, const u8 *sa, u8 dialog_token,
628 				u16 update_indic, const u8 *tlvs,
629 				size_t tlvs_len)
630 {
631 	wpas_dbus_signal_p2p_sd_request(wpa_s, freq, sa, dialog_token,
632 					update_indic, tlvs, tlvs_len);
633 }
634 
635 
wpas_notify_p2p_sd_response(struct wpa_supplicant * wpa_s,const u8 * sa,u16 update_indic,const u8 * tlvs,size_t tlvs_len)636 void wpas_notify_p2p_sd_response(struct wpa_supplicant *wpa_s,
637 				 const u8 *sa, u16 update_indic,
638 				 const u8 *tlvs, size_t tlvs_len)
639 {
640 	wpas_dbus_signal_p2p_sd_response(wpa_s, sa, update_indic,
641 					 tlvs, tlvs_len);
642 }
643 
644 
645 /**
646  * wpas_notify_p2p_provision_discovery - Notification of provision discovery
647  * @dev_addr: Who sent the request or responded to our request.
648  * @request: Will be 1 if request, 0 for response.
649  * @status: Valid only in case of response (0 in case of success)
650  * @config_methods: WPS config methods
651  * @generated_pin: PIN to be displayed in case of WPS_CONFIG_DISPLAY method
652  *
653  * This can be used to notify:
654  * - Requests or responses
655  * - Various config methods
656  * - Failure condition in case of response
657  */
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)658 void wpas_notify_p2p_provision_discovery(struct wpa_supplicant *wpa_s,
659 					 const u8 *dev_addr, int request,
660 					 enum p2p_prov_disc_status status,
661 					 u16 config_methods,
662 					 unsigned int generated_pin)
663 {
664 	wpas_dbus_signal_p2p_provision_discovery(wpa_s, dev_addr, request,
665 						 status, config_methods,
666 						 generated_pin);
667 }
668 
669 
wpas_notify_p2p_group_started(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid,int network_id,int client)670 void wpas_notify_p2p_group_started(struct wpa_supplicant *wpa_s,
671 				   struct wpa_ssid *ssid, int network_id,
672 				   int client)
673 {
674 	/* Notify a group has been started */
675 	wpas_dbus_register_p2p_group(wpa_s, ssid);
676 
677 	wpas_dbus_signal_p2p_group_started(wpa_s, ssid, client, network_id);
678 }
679 
680 
wpas_notify_p2p_group_formation_failure(struct wpa_supplicant * wpa_s,const char * reason)681 void wpas_notify_p2p_group_formation_failure(struct wpa_supplicant *wpa_s,
682 					     const char *reason)
683 {
684 	/* Notify a group formation failed */
685 	wpas_dbus_signal_p2p_group_formation_failure(wpa_s, reason);
686 }
687 
688 
wpas_notify_p2p_wps_failed(struct wpa_supplicant * wpa_s,struct wps_event_fail * fail)689 void wpas_notify_p2p_wps_failed(struct wpa_supplicant *wpa_s,
690 				struct wps_event_fail *fail)
691 {
692 	wpas_dbus_signal_p2p_wps_failed(wpa_s, fail);
693 }
694 
695 
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)696 void wpas_notify_p2p_invitation_received(struct wpa_supplicant *wpa_s,
697 					 const u8 *sa, const u8 *go_dev_addr,
698 					 const u8 *bssid, int id, int op_freq)
699 {
700 	/* Notify a P2P Invitation Request */
701 	wpas_dbus_signal_p2p_invitation_received(wpa_s, sa, go_dev_addr, bssid,
702 						 id, op_freq);
703 }
704 
705 #endif /* CONFIG_P2P */
706 
707 
wpas_notify_ap_sta_authorized(struct wpa_supplicant * wpa_s,const u8 * sta,const u8 * p2p_dev_addr)708 static void wpas_notify_ap_sta_authorized(struct wpa_supplicant *wpa_s,
709 					  const u8 *sta,
710 					  const u8 *p2p_dev_addr)
711 {
712 #ifdef CONFIG_P2P
713 	wpas_p2p_notify_ap_sta_authorized(wpa_s, p2p_dev_addr);
714 
715 	/*
716 	 * Create 'peer-joined' signal on group object -- will also
717 	 * check P2P itself.
718 	 */
719 	if (p2p_dev_addr)
720 		wpas_dbus_signal_p2p_peer_joined(wpa_s, p2p_dev_addr);
721 #endif /* CONFIG_P2P */
722 
723 	/* Notify listeners a new station has been authorized */
724 	wpas_dbus_signal_sta_authorized(wpa_s, sta);
725 }
726 
727 
wpas_notify_ap_sta_deauthorized(struct wpa_supplicant * wpa_s,const u8 * sta,const u8 * p2p_dev_addr)728 static void wpas_notify_ap_sta_deauthorized(struct wpa_supplicant *wpa_s,
729 					    const u8 *sta,
730 					    const u8 *p2p_dev_addr)
731 {
732 #ifdef CONFIG_P2P
733 	/*
734 	 * Create 'peer-disconnected' signal on group object if this
735 	 * is a P2P group.
736 	 */
737 	if (p2p_dev_addr)
738 		wpas_dbus_signal_p2p_peer_disconnected(wpa_s, p2p_dev_addr);
739 #endif /* CONFIG_P2P */
740 
741 	/* Notify listeners a station has been deauthorized */
742 	wpas_dbus_signal_sta_deauthorized(wpa_s, sta);
743 }
744 
745 
wpas_notify_sta_authorized(struct wpa_supplicant * wpa_s,const u8 * mac_addr,int authorized,const u8 * p2p_dev_addr)746 void wpas_notify_sta_authorized(struct wpa_supplicant *wpa_s,
747 				const u8 *mac_addr, int authorized,
748 				const u8 *p2p_dev_addr)
749 {
750 	if (authorized)
751 		wpas_notify_ap_sta_authorized(wpa_s, mac_addr, p2p_dev_addr);
752 	else
753 		wpas_notify_ap_sta_deauthorized(wpa_s, mac_addr, p2p_dev_addr);
754 }
755 
756 
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)757 void wpas_notify_certification(struct wpa_supplicant *wpa_s, int depth,
758 			       const char *subject, const char *altsubject[],
759 			       int num_altsubject, const char *cert_hash,
760 			       const struct wpabuf *cert)
761 {
762 	wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_EAP_PEER_CERT
763 		"depth=%d subject='%s'%s%s",
764 		depth, subject, cert_hash ? " hash=" : "",
765 		cert_hash ? cert_hash : "");
766 
767 	if (cert) {
768 		char *cert_hex;
769 		size_t len = wpabuf_len(cert) * 2 + 1;
770 		cert_hex = os_malloc(len);
771 		if (cert_hex) {
772 			wpa_snprintf_hex(cert_hex, len, wpabuf_head(cert),
773 					 wpabuf_len(cert));
774 			wpa_msg_ctrl(wpa_s, MSG_INFO,
775 				     WPA_EVENT_EAP_PEER_CERT
776 				     "depth=%d subject='%s' cert=%s",
777 				     depth, subject, cert_hex);
778 			os_free(cert_hex);
779 		}
780 	}
781 
782 	if (altsubject) {
783 		int i;
784 
785 		for (i = 0; i < num_altsubject; i++)
786 			wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_EAP_PEER_ALT
787 				"depth=%d %s", depth, altsubject[i]);
788 	}
789 
790 	/* notify the old DBus API */
791 	wpa_supplicant_dbus_notify_certification(wpa_s, depth, subject,
792 						 cert_hash, cert);
793 	/* notify the new DBus API */
794 	wpas_dbus_signal_certification(wpa_s, depth, subject, altsubject,
795 				       num_altsubject, cert_hash, cert);
796 }
797 
798 
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)799 void wpas_notify_preq(struct wpa_supplicant *wpa_s,
800 		      const u8 *addr, const u8 *dst, const u8 *bssid,
801 		      const u8 *ie, size_t ie_len, u32 ssi_signal)
802 {
803 #ifdef CONFIG_AP
804 	wpas_dbus_signal_preq(wpa_s, addr, dst, bssid, ie, ie_len, ssi_signal);
805 #endif /* CONFIG_AP */
806 }
807 
808 
wpas_notify_eap_status(struct wpa_supplicant * wpa_s,const char * status,const char * parameter)809 void wpas_notify_eap_status(struct wpa_supplicant *wpa_s, const char *status,
810 			    const char *parameter)
811 {
812 	wpas_dbus_signal_eap_status(wpa_s, status, parameter);
813 	wpa_msg_ctrl(wpa_s, MSG_INFO, WPA_EVENT_EAP_STATUS
814 		     "status='%s' parameter='%s'",
815 		     status, parameter);
816 }
817 
818 
wpas_notify_network_bssid_set_changed(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)819 void wpas_notify_network_bssid_set_changed(struct wpa_supplicant *wpa_s,
820 					   struct wpa_ssid *ssid)
821 {
822 	if (wpa_s->current_ssid != ssid)
823 		return;
824 
825 	wpa_dbg(wpa_s, MSG_DEBUG,
826 		"Network bssid config changed for the current network - within-ESS roaming %s",
827 		ssid->bssid_set ? "disabled" : "enabled");
828 
829 	wpa_drv_roaming(wpa_s, !ssid->bssid_set,
830 			ssid->bssid_set ? ssid->bssid : NULL);
831 }
832 
833 
wpas_notify_network_type_changed(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)834 void wpas_notify_network_type_changed(struct wpa_supplicant *wpa_s,
835 				      struct wpa_ssid *ssid)
836 {
837 #ifdef CONFIG_P2P
838 	if (ssid->disabled == 2) {
839 		/* Changed from normal network profile to persistent group */
840 		ssid->disabled = 0;
841 		wpas_dbus_unregister_network(wpa_s, ssid->id);
842 		ssid->disabled = 2;
843 		ssid->p2p_persistent_group = 1;
844 		wpas_dbus_register_persistent_group(wpa_s, ssid);
845 	} else {
846 		/* Changed from persistent group to normal network profile */
847 		wpas_dbus_unregister_persistent_group(wpa_s, ssid->id);
848 		ssid->p2p_persistent_group = 0;
849 		wpas_dbus_register_network(wpa_s, ssid);
850 	}
851 #endif /* CONFIG_P2P */
852 }
853