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 "driver_i.h"
21 #include "scan.h"
22 #include "p2p_supplicant.h"
23 #include "sme.h"
24 #include "notify.h"
25
wpas_notify_supplicant_initialized(struct wpa_global * global)26 int wpas_notify_supplicant_initialized(struct wpa_global *global)
27 {
28 #ifdef CONFIG_DBUS
29 if (global->params.dbus_ctrl_interface) {
30 global->dbus = wpas_dbus_init(global);
31 if (global->dbus == NULL)
32 return -1;
33 }
34 #endif /* CONFIG_DBUS */
35
36 return 0;
37 }
38
39
wpas_notify_supplicant_deinitialized(struct wpa_global * global)40 void wpas_notify_supplicant_deinitialized(struct wpa_global *global)
41 {
42 #ifdef CONFIG_DBUS
43 if (global->dbus)
44 wpas_dbus_deinit(global->dbus);
45 #endif /* CONFIG_DBUS */
46 }
47
48
wpas_notify_iface_added(struct wpa_supplicant * wpa_s)49 int wpas_notify_iface_added(struct wpa_supplicant *wpa_s)
50 {
51 if (wpas_dbus_register_iface(wpa_s))
52 return -1;
53
54 if (wpas_dbus_register_interface(wpa_s))
55 return -1;
56
57 return 0;
58 }
59
60
wpas_notify_iface_removed(struct wpa_supplicant * wpa_s)61 void wpas_notify_iface_removed(struct wpa_supplicant *wpa_s)
62 {
63 /* unregister interface in old DBus ctrl iface */
64 wpas_dbus_unregister_iface(wpa_s);
65
66 /* unregister interface in new DBus ctrl iface */
67 wpas_dbus_unregister_interface(wpa_s);
68 }
69
70
wpas_notify_state_changed(struct wpa_supplicant * wpa_s,enum wpa_states new_state,enum wpa_states old_state)71 void wpas_notify_state_changed(struct wpa_supplicant *wpa_s,
72 enum wpa_states new_state,
73 enum wpa_states old_state)
74 {
75 /* notify the old DBus API */
76 wpa_supplicant_dbus_notify_state_change(wpa_s, new_state,
77 old_state);
78
79 /* notify the new DBus API */
80 wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_STATE);
81
82 #ifdef CONFIG_P2P
83 if (new_state == WPA_COMPLETED)
84 wpas_p2p_notif_connected(wpa_s);
85 else if (new_state < WPA_ASSOCIATED)
86 wpas_p2p_notif_disconnected(wpa_s);
87 #endif /* CONFIG_P2P */
88
89 sme_state_changed(wpa_s);
90
91 #ifdef ANDROID
92 wpa_msg_ctrl(wpa_s, MSG_INFO, WPA_EVENT_STATE_CHANGE
93 "id=%d state=%d BSSID=" MACSTR " SSID=%s",
94 wpa_s->current_ssid ? wpa_s->current_ssid->id : -1,
95 new_state,
96 MAC2STR(wpa_s->pending_bssid),
97 wpa_s->current_ssid && wpa_s->current_ssid->ssid ?
98 wpa_ssid_txt(wpa_s->current_ssid->ssid,
99 wpa_s->current_ssid->ssid_len): "");
100 #endif /* ANDROID */
101 }
102
103
wpas_notify_network_changed(struct wpa_supplicant * wpa_s)104 void wpas_notify_network_changed(struct wpa_supplicant *wpa_s)
105 {
106 wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_CURRENT_NETWORK);
107 }
108
109
wpas_notify_ap_scan_changed(struct wpa_supplicant * wpa_s)110 void wpas_notify_ap_scan_changed(struct wpa_supplicant *wpa_s)
111 {
112 wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_AP_SCAN);
113 }
114
115
wpas_notify_bssid_changed(struct wpa_supplicant * wpa_s)116 void wpas_notify_bssid_changed(struct wpa_supplicant *wpa_s)
117 {
118 wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_CURRENT_BSS);
119 }
120
121
wpas_notify_auth_changed(struct wpa_supplicant * wpa_s)122 void wpas_notify_auth_changed(struct wpa_supplicant *wpa_s)
123 {
124 wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_CURRENT_AUTH_MODE);
125 }
126
127
wpas_notify_network_enabled_changed(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)128 void wpas_notify_network_enabled_changed(struct wpa_supplicant *wpa_s,
129 struct wpa_ssid *ssid)
130 {
131 wpas_dbus_signal_network_enabled_changed(wpa_s, ssid);
132 }
133
134
wpas_notify_network_selected(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)135 void wpas_notify_network_selected(struct wpa_supplicant *wpa_s,
136 struct wpa_ssid *ssid)
137 {
138 wpas_dbus_signal_network_selected(wpa_s, ssid->id);
139 }
140
141
wpas_notify_network_request(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid,enum wpa_ctrl_req_type rtype,const char * default_txt)142 void wpas_notify_network_request(struct wpa_supplicant *wpa_s,
143 struct wpa_ssid *ssid,
144 enum wpa_ctrl_req_type rtype,
145 const char *default_txt)
146 {
147 wpas_dbus_signal_network_request(wpa_s, ssid, rtype, default_txt);
148 }
149
150
wpas_notify_scanning(struct wpa_supplicant * wpa_s)151 void wpas_notify_scanning(struct wpa_supplicant *wpa_s)
152 {
153 /* notify the old DBus API */
154 wpa_supplicant_dbus_notify_scanning(wpa_s);
155
156 /* notify the new DBus API */
157 wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_SCANNING);
158 }
159
160
wpas_notify_scan_done(struct wpa_supplicant * wpa_s,int success)161 void wpas_notify_scan_done(struct wpa_supplicant *wpa_s, int success)
162 {
163 wpas_dbus_signal_scan_done(wpa_s, success);
164 }
165
166
wpas_notify_scan_results(struct wpa_supplicant * wpa_s)167 void wpas_notify_scan_results(struct wpa_supplicant *wpa_s)
168 {
169 /* notify the old DBus API */
170 wpa_supplicant_dbus_notify_scan_results(wpa_s);
171
172 wpas_wps_notify_scan_results(wpa_s);
173 }
174
175
wpas_notify_wps_credential(struct wpa_supplicant * wpa_s,const struct wps_credential * cred)176 void wpas_notify_wps_credential(struct wpa_supplicant *wpa_s,
177 const struct wps_credential *cred)
178 {
179 #ifdef CONFIG_WPS
180 /* notify the old DBus API */
181 wpa_supplicant_dbus_notify_wps_cred(wpa_s, cred);
182 /* notify the new DBus API */
183 wpas_dbus_signal_wps_cred(wpa_s, cred);
184 #endif /* CONFIG_WPS */
185 }
186
187
wpas_notify_wps_event_m2d(struct wpa_supplicant * wpa_s,struct wps_event_m2d * m2d)188 void wpas_notify_wps_event_m2d(struct wpa_supplicant *wpa_s,
189 struct wps_event_m2d *m2d)
190 {
191 #ifdef CONFIG_WPS
192 wpas_dbus_signal_wps_event_m2d(wpa_s, m2d);
193 #endif /* CONFIG_WPS */
194 }
195
196
wpas_notify_wps_event_fail(struct wpa_supplicant * wpa_s,struct wps_event_fail * fail)197 void wpas_notify_wps_event_fail(struct wpa_supplicant *wpa_s,
198 struct wps_event_fail *fail)
199 {
200 #ifdef CONFIG_WPS
201 wpas_dbus_signal_wps_event_fail(wpa_s, fail);
202 #endif /* CONFIG_WPS */
203 }
204
205
wpas_notify_wps_event_success(struct wpa_supplicant * wpa_s)206 void wpas_notify_wps_event_success(struct wpa_supplicant *wpa_s)
207 {
208 #ifdef CONFIG_WPS
209 wpas_dbus_signal_wps_event_success(wpa_s);
210 #endif /* CONFIG_WPS */
211 }
212
213
wpas_notify_network_added(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)214 void wpas_notify_network_added(struct wpa_supplicant *wpa_s,
215 struct wpa_ssid *ssid)
216 {
217 /*
218 * Networks objects created during any P2P activities should not be
219 * exposed out. They might/will confuse certain non-P2P aware
220 * applications since these network objects won't behave like
221 * regular ones.
222 */
223 if (wpa_s->global->p2p_group_formation != wpa_s)
224 wpas_dbus_register_network(wpa_s, ssid);
225 }
226
227
wpas_notify_persistent_group_added(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)228 void wpas_notify_persistent_group_added(struct wpa_supplicant *wpa_s,
229 struct wpa_ssid *ssid)
230 {
231 #ifdef CONFIG_P2P
232 wpas_dbus_register_persistent_group(wpa_s, ssid);
233 #endif /* CONFIG_P2P */
234 }
235
236
wpas_notify_persistent_group_removed(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)237 void wpas_notify_persistent_group_removed(struct wpa_supplicant *wpa_s,
238 struct wpa_ssid *ssid)
239 {
240 #ifdef CONFIG_P2P
241 wpas_dbus_unregister_persistent_group(wpa_s, ssid->id);
242 #endif /* CONFIG_P2P */
243 }
244
245
wpas_notify_network_removed(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)246 void wpas_notify_network_removed(struct wpa_supplicant *wpa_s,
247 struct wpa_ssid *ssid)
248 {
249 if (wpa_s->wpa)
250 wpa_sm_pmksa_cache_flush(wpa_s->wpa, ssid);
251 if (wpa_s->global->p2p_group_formation != wpa_s)
252 wpas_dbus_unregister_network(wpa_s, ssid->id);
253 #ifdef CONFIG_P2P
254 wpas_p2p_network_removed(wpa_s, ssid);
255 #endif /* CONFIG_P2P */
256 }
257
258
wpas_notify_bss_added(struct wpa_supplicant * wpa_s,u8 bssid[],unsigned int id)259 void wpas_notify_bss_added(struct wpa_supplicant *wpa_s,
260 u8 bssid[], unsigned int id)
261 {
262 wpas_dbus_register_bss(wpa_s, bssid, id);
263 wpa_msg_ctrl(wpa_s, MSG_INFO, WPA_EVENT_BSS_ADDED "%u " MACSTR,
264 id, MAC2STR(bssid));
265 }
266
267
wpas_notify_bss_removed(struct wpa_supplicant * wpa_s,u8 bssid[],unsigned int id)268 void wpas_notify_bss_removed(struct wpa_supplicant *wpa_s,
269 u8 bssid[], unsigned int id)
270 {
271 wpas_dbus_unregister_bss(wpa_s, bssid, id);
272 wpa_msg_ctrl(wpa_s, MSG_INFO, WPA_EVENT_BSS_REMOVED "%u " MACSTR,
273 id, MAC2STR(bssid));
274 }
275
276
wpas_notify_bss_freq_changed(struct wpa_supplicant * wpa_s,unsigned int id)277 void wpas_notify_bss_freq_changed(struct wpa_supplicant *wpa_s,
278 unsigned int id)
279 {
280 wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_FREQ, id);
281 }
282
283
wpas_notify_bss_signal_changed(struct wpa_supplicant * wpa_s,unsigned int id)284 void wpas_notify_bss_signal_changed(struct wpa_supplicant *wpa_s,
285 unsigned int id)
286 {
287 wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_SIGNAL,
288 id);
289 }
290
291
wpas_notify_bss_privacy_changed(struct wpa_supplicant * wpa_s,unsigned int id)292 void wpas_notify_bss_privacy_changed(struct wpa_supplicant *wpa_s,
293 unsigned int id)
294 {
295 wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_PRIVACY,
296 id);
297 }
298
299
wpas_notify_bss_mode_changed(struct wpa_supplicant * wpa_s,unsigned int id)300 void wpas_notify_bss_mode_changed(struct wpa_supplicant *wpa_s,
301 unsigned int id)
302 {
303 wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_MODE, id);
304 }
305
306
wpas_notify_bss_wpaie_changed(struct wpa_supplicant * wpa_s,unsigned int id)307 void wpas_notify_bss_wpaie_changed(struct wpa_supplicant *wpa_s,
308 unsigned int id)
309 {
310 wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_WPA, id);
311 }
312
313
wpas_notify_bss_rsnie_changed(struct wpa_supplicant * wpa_s,unsigned int id)314 void wpas_notify_bss_rsnie_changed(struct wpa_supplicant *wpa_s,
315 unsigned int id)
316 {
317 wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_RSN, id);
318 }
319
320
wpas_notify_bss_wps_changed(struct wpa_supplicant * wpa_s,unsigned int id)321 void wpas_notify_bss_wps_changed(struct wpa_supplicant *wpa_s,
322 unsigned int id)
323 {
324 }
325
326
wpas_notify_bss_ies_changed(struct wpa_supplicant * wpa_s,unsigned int id)327 void wpas_notify_bss_ies_changed(struct wpa_supplicant *wpa_s,
328 unsigned int id)
329 {
330 wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_IES, id);
331 }
332
333
wpas_notify_bss_rates_changed(struct wpa_supplicant * wpa_s,unsigned int id)334 void wpas_notify_bss_rates_changed(struct wpa_supplicant *wpa_s,
335 unsigned int id)
336 {
337 wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_RATES, id);
338 }
339
340
wpas_notify_blob_added(struct wpa_supplicant * wpa_s,const char * name)341 void wpas_notify_blob_added(struct wpa_supplicant *wpa_s, const char *name)
342 {
343 wpas_dbus_signal_blob_added(wpa_s, name);
344 }
345
346
wpas_notify_blob_removed(struct wpa_supplicant * wpa_s,const char * name)347 void wpas_notify_blob_removed(struct wpa_supplicant *wpa_s, const char *name)
348 {
349 wpas_dbus_signal_blob_removed(wpa_s, name);
350 }
351
352
wpas_notify_debug_level_changed(struct wpa_global * global)353 void wpas_notify_debug_level_changed(struct wpa_global *global)
354 {
355 wpas_dbus_signal_debug_level_changed(global);
356 }
357
358
wpas_notify_debug_timestamp_changed(struct wpa_global * global)359 void wpas_notify_debug_timestamp_changed(struct wpa_global *global)
360 {
361 wpas_dbus_signal_debug_timestamp_changed(global);
362 }
363
364
wpas_notify_debug_show_keys_changed(struct wpa_global * global)365 void wpas_notify_debug_show_keys_changed(struct wpa_global *global)
366 {
367 wpas_dbus_signal_debug_show_keys_changed(global);
368 }
369
370
wpas_notify_suspend(struct wpa_global * global)371 void wpas_notify_suspend(struct wpa_global *global)
372 {
373 struct wpa_supplicant *wpa_s;
374
375 os_get_time(&global->suspend_time);
376 wpa_printf(MSG_DEBUG, "System suspend notification");
377 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
378 wpa_drv_suspend(wpa_s);
379 }
380
381
wpas_notify_resume(struct wpa_global * global)382 void wpas_notify_resume(struct wpa_global *global)
383 {
384 struct os_time now;
385 int slept;
386 struct wpa_supplicant *wpa_s;
387
388 if (global->suspend_time.sec == 0)
389 slept = -1;
390 else {
391 os_get_time(&now);
392 slept = now.sec - global->suspend_time.sec;
393 }
394 wpa_printf(MSG_DEBUG, "System resume notification (slept %d seconds)",
395 slept);
396
397 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
398 wpa_drv_resume(wpa_s);
399 if (wpa_s->wpa_state == WPA_DISCONNECTED)
400 wpa_supplicant_req_scan(wpa_s, 0, 100000);
401 }
402 }
403
404
405 #ifdef CONFIG_P2P
406
wpas_notify_p2p_device_found(struct wpa_supplicant * wpa_s,const u8 * dev_addr,int new_device)407 void wpas_notify_p2p_device_found(struct wpa_supplicant *wpa_s,
408 const u8 *dev_addr, int new_device)
409 {
410 if (new_device) {
411 /* Create the new peer object */
412 wpas_dbus_register_peer(wpa_s, dev_addr);
413 }
414
415 /* Notify a new peer has been detected*/
416 wpas_dbus_signal_peer_device_found(wpa_s, dev_addr);
417 }
418
419
wpas_notify_p2p_device_lost(struct wpa_supplicant * wpa_s,const u8 * dev_addr)420 void wpas_notify_p2p_device_lost(struct wpa_supplicant *wpa_s,
421 const u8 *dev_addr)
422 {
423 wpas_dbus_unregister_peer(wpa_s, dev_addr);
424
425 /* Create signal on interface object*/
426 wpas_dbus_signal_peer_device_lost(wpa_s, dev_addr);
427 }
428
429
wpas_notify_p2p_group_removed(struct wpa_supplicant * wpa_s,const struct wpa_ssid * ssid,const char * role)430 void wpas_notify_p2p_group_removed(struct wpa_supplicant *wpa_s,
431 const struct wpa_ssid *ssid,
432 const char *role)
433 {
434 wpas_dbus_unregister_p2p_group(wpa_s, ssid);
435
436 wpas_dbus_signal_p2p_group_removed(wpa_s, role);
437 }
438
439
wpas_notify_p2p_go_neg_req(struct wpa_supplicant * wpa_s,const u8 * src,u16 dev_passwd_id)440 void wpas_notify_p2p_go_neg_req(struct wpa_supplicant *wpa_s,
441 const u8 *src, u16 dev_passwd_id)
442 {
443 wpas_dbus_signal_p2p_go_neg_req(wpa_s, src, dev_passwd_id);
444 }
445
446
wpas_notify_p2p_go_neg_completed(struct wpa_supplicant * wpa_s,struct p2p_go_neg_results * res)447 void wpas_notify_p2p_go_neg_completed(struct wpa_supplicant *wpa_s,
448 struct p2p_go_neg_results *res)
449 {
450 wpas_dbus_signal_p2p_go_neg_resp(wpa_s, res);
451 }
452
453
wpas_notify_p2p_invitation_result(struct wpa_supplicant * wpa_s,int status,const u8 * bssid)454 void wpas_notify_p2p_invitation_result(struct wpa_supplicant *wpa_s,
455 int status, const u8 *bssid)
456 {
457 wpas_dbus_signal_p2p_invitation_result(wpa_s, status, bssid);
458 }
459
460
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)461 void wpas_notify_p2p_sd_request(struct wpa_supplicant *wpa_s,
462 int freq, const u8 *sa, u8 dialog_token,
463 u16 update_indic, const u8 *tlvs,
464 size_t tlvs_len)
465 {
466 wpas_dbus_signal_p2p_sd_request(wpa_s, freq, sa, dialog_token,
467 update_indic, tlvs, tlvs_len);
468 }
469
470
wpas_notify_p2p_sd_response(struct wpa_supplicant * wpa_s,const u8 * sa,u16 update_indic,const u8 * tlvs,size_t tlvs_len)471 void wpas_notify_p2p_sd_response(struct wpa_supplicant *wpa_s,
472 const u8 *sa, u16 update_indic,
473 const u8 *tlvs, size_t tlvs_len)
474 {
475 wpas_dbus_signal_p2p_sd_response(wpa_s, sa, update_indic,
476 tlvs, tlvs_len);
477 }
478
479
480 /**
481 * wpas_notify_p2p_provision_discovery - Notification of provision discovery
482 * @dev_addr: Who sent the request or responded to our request.
483 * @request: Will be 1 if request, 0 for response.
484 * @status: Valid only in case of response (0 in case of success)
485 * @config_methods: WPS config methods
486 * @generated_pin: PIN to be displayed in case of WPS_CONFIG_DISPLAY method
487 *
488 * This can be used to notify:
489 * - Requests or responses
490 * - Various config methods
491 * - Failure condition in case of response
492 */
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)493 void wpas_notify_p2p_provision_discovery(struct wpa_supplicant *wpa_s,
494 const u8 *dev_addr, int request,
495 enum p2p_prov_disc_status status,
496 u16 config_methods,
497 unsigned int generated_pin)
498 {
499 wpas_dbus_signal_p2p_provision_discovery(wpa_s, dev_addr, request,
500 status, config_methods,
501 generated_pin);
502 }
503
504
wpas_notify_p2p_group_started(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid,int network_id,int client)505 void wpas_notify_p2p_group_started(struct wpa_supplicant *wpa_s,
506 struct wpa_ssid *ssid, int network_id,
507 int client)
508 {
509 /* Notify a group has been started */
510 wpas_dbus_register_p2p_group(wpa_s, ssid);
511
512 wpas_dbus_signal_p2p_group_started(wpa_s, ssid, client, network_id);
513 }
514
515
wpas_notify_p2p_wps_failed(struct wpa_supplicant * wpa_s,struct wps_event_fail * fail)516 void wpas_notify_p2p_wps_failed(struct wpa_supplicant *wpa_s,
517 struct wps_event_fail *fail)
518 {
519 wpas_dbus_signal_p2p_wps_failed(wpa_s, fail);
520 }
521
522 #endif /* CONFIG_P2P */
523
524
wpas_notify_ap_sta_authorized(struct wpa_supplicant * wpa_s,const u8 * sta,const u8 * p2p_dev_addr)525 static void wpas_notify_ap_sta_authorized(struct wpa_supplicant *wpa_s,
526 const u8 *sta,
527 const u8 *p2p_dev_addr)
528 {
529 #ifdef CONFIG_P2P
530 wpas_p2p_notify_ap_sta_authorized(wpa_s, p2p_dev_addr);
531
532 /*
533 * Register a group member object corresponding to this peer and
534 * emit a PeerJoined signal. This will check if it really is a
535 * P2P group.
536 */
537 wpas_dbus_register_p2p_groupmember(wpa_s, sta);
538
539 /*
540 * Create 'peer-joined' signal on group object -- will also
541 * check P2P itself.
542 */
543 wpas_dbus_signal_p2p_peer_joined(wpa_s, sta);
544 #endif /* CONFIG_P2P */
545 }
546
547
wpas_notify_ap_sta_deauthorized(struct wpa_supplicant * wpa_s,const u8 * sta)548 static void wpas_notify_ap_sta_deauthorized(struct wpa_supplicant *wpa_s,
549 const u8 *sta)
550 {
551 #ifdef CONFIG_P2P
552 /*
553 * Unregister a group member object corresponding to this peer
554 * if this is a P2P group.
555 */
556 wpas_dbus_unregister_p2p_groupmember(wpa_s, sta);
557
558 /*
559 * Create 'peer-disconnected' signal on group object if this
560 * is a P2P group.
561 */
562 wpas_dbus_signal_p2p_peer_disconnected(wpa_s, sta);
563 #endif /* CONFIG_P2P */
564 }
565
566
wpas_notify_sta_authorized(struct wpa_supplicant * wpa_s,const u8 * mac_addr,int authorized,const u8 * p2p_dev_addr)567 void wpas_notify_sta_authorized(struct wpa_supplicant *wpa_s,
568 const u8 *mac_addr, int authorized,
569 const u8 *p2p_dev_addr)
570 {
571 if (authorized)
572 wpas_notify_ap_sta_authorized(wpa_s, mac_addr, p2p_dev_addr);
573 else
574 wpas_notify_ap_sta_deauthorized(wpa_s, mac_addr);
575 }
576
577
wpas_notify_certification(struct wpa_supplicant * wpa_s,int depth,const char * subject,const char * cert_hash,const struct wpabuf * cert)578 void wpas_notify_certification(struct wpa_supplicant *wpa_s, int depth,
579 const char *subject, const char *cert_hash,
580 const struct wpabuf *cert)
581 {
582 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_EAP_PEER_CERT
583 "depth=%d subject='%s'%s%s",
584 depth, subject,
585 cert_hash ? " hash=" : "",
586 cert_hash ? cert_hash : "");
587
588 if (cert) {
589 char *cert_hex;
590 size_t len = wpabuf_len(cert) * 2 + 1;
591 cert_hex = os_malloc(len);
592 if (cert_hex) {
593 wpa_snprintf_hex(cert_hex, len, wpabuf_head(cert),
594 wpabuf_len(cert));
595 wpa_msg_ctrl(wpa_s, MSG_INFO,
596 WPA_EVENT_EAP_PEER_CERT
597 "depth=%d subject='%s' cert=%s",
598 depth, subject, cert_hex);
599 os_free(cert_hex);
600 }
601 }
602
603 /* notify the old DBus API */
604 wpa_supplicant_dbus_notify_certification(wpa_s, depth, subject,
605 cert_hash, cert);
606 /* notify the new DBus API */
607 wpas_dbus_signal_certification(wpa_s, depth, subject, cert_hash, cert);
608 }
609