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