TDLS: Declare tdls_testing as extern in a header file
[mech_eap.git] / wpa_supplicant / notify.c
index de33019..67e36ae 100644 (file)
 #include "config.h"
 #include "wpa_supplicant_i.h"
 #include "wps_supplicant.h"
+#include "binder/binder.h"
 #include "dbus/dbus_common.h"
 #include "dbus/dbus_old.h"
 #include "dbus/dbus_new.h"
 #include "rsn_supp/wpa.h"
+#include "fst/fst.h"
 #include "driver_i.h"
 #include "scan.h"
 #include "p2p_supplicant.h"
@@ -33,6 +35,12 @@ int wpas_notify_supplicant_initialized(struct wpa_global *global)
        }
 #endif /* CONFIG_DBUS */
 
+#ifdef CONFIG_BINDER
+       global->binder = wpas_binder_init(global);
+       if (!global->binder)
+               return -1;
+#endif /* CONFIG_BINDER */
+
        return 0;
 }
 
@@ -43,6 +51,11 @@ void wpas_notify_supplicant_deinitialized(struct wpa_global *global)
        if (global->dbus)
                wpas_dbus_deinit(global->dbus);
 #endif /* CONFIG_DBUS */
+
+#ifdef CONFIG_BINDER
+       if (global->binder)
+               wpas_binder_deinit(global->binder);
+#endif /* CONFIG_BINDER */
 }
 
 
@@ -88,6 +101,16 @@ void wpas_notify_state_changed(struct wpa_supplicant *wpa_s,
        /* notify the new DBus API */
        wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_STATE);
 
+#ifdef CONFIG_FST
+       if (wpa_s->fst && !is_zero_ether_addr(wpa_s->bssid)) {
+               if (new_state == WPA_COMPLETED)
+                       fst_notify_peer_connected(wpa_s->fst, wpa_s->bssid);
+               else if (old_state >= WPA_ASSOCIATED &&
+                        new_state < WPA_ASSOCIATED)
+                       fst_notify_peer_disconnected(wpa_s->fst, wpa_s->bssid);
+       }
+#endif /* CONFIG_FST */
+
        if (new_state == WPA_COMPLETED)
                wpas_p2p_notif_connected(wpa_s);
        else if (old_state >= WPA_ASSOCIATED && new_state < WPA_ASSOCIATED)
@@ -117,6 +140,15 @@ void wpas_notify_disconnect_reason(struct wpa_supplicant *wpa_s)
 }
 
 
+void wpas_notify_assoc_status_code(struct wpa_supplicant *wpa_s)
+{
+       if (wpa_s->p2p_mgmt)
+               return;
+
+       wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_ASSOC_STATUS_CODE);
+}
+
+
 void wpas_notify_network_changed(struct wpa_supplicant *wpa_s)
 {
        if (wpa_s->p2p_mgmt)
@@ -268,6 +300,16 @@ void wpas_notify_wps_event_success(struct wpa_supplicant *wpa_s)
 #endif /* CONFIG_WPS */
 }
 
+void wpas_notify_wps_event_pbc_overlap(struct wpa_supplicant *wpa_s)
+{
+       if (wpa_s->p2p_mgmt)
+               return;
+
+#ifdef CONFIG_WPS
+       wpas_dbus_signal_wps_event_pbc_overlap(wpa_s);
+#endif /* CONFIG_WPS */
+}
+
 
 void wpas_notify_network_added(struct wpa_supplicant *wpa_s,
                               struct wpa_ssid *ssid)
@@ -307,15 +349,16 @@ void wpas_notify_persistent_group_removed(struct wpa_supplicant *wpa_s,
 void wpas_notify_network_removed(struct wpa_supplicant *wpa_s,
                                 struct wpa_ssid *ssid)
 {
-       if (wpa_s->p2p_mgmt)
-               return;
-
        if (wpa_s->next_ssid == ssid)
                wpa_s->next_ssid = NULL;
        if (wpa_s->wpa)
                wpa_sm_pmksa_cache_flush(wpa_s->wpa, ssid);
-       if (!ssid->p2p_group && wpa_s->global->p2p_group_formation != wpa_s)
+       if (!ssid->p2p_group && wpa_s->global->p2p_group_formation != wpa_s &&
+           !wpa_s->p2p_mgmt)
                wpas_dbus_unregister_network(wpa_s, ssid->id);
+       if (network_is_persistent_group(ssid))
+               wpas_notify_persistent_group_removed(wpa_s, ssid);
+
        wpas_p2p_network_removed(wpa_s, ssid);
 }
 
@@ -519,6 +562,13 @@ void wpas_notify_resume(struct wpa_global *global)
 
 #ifdef CONFIG_P2P
 
+void wpas_notify_p2p_find_stopped(struct wpa_supplicant *wpa_s)
+{
+       /* Notify P2P find has stopped */
+       wpas_dbus_signal_p2p_find_stopped(wpa_s);
+}
+
+
 void wpas_notify_p2p_device_found(struct wpa_supplicant *wpa_s,
                                  const u8 *dev_addr, int new_device)
 {
@@ -553,9 +603,9 @@ void wpas_notify_p2p_group_removed(struct wpa_supplicant *wpa_s,
 
 
 void wpas_notify_p2p_go_neg_req(struct wpa_supplicant *wpa_s,
-                               const u8 *src, u16 dev_passwd_id)
+                               const u8 *src, u16 dev_passwd_id, u8 go_intent)
 {
-       wpas_dbus_signal_p2p_go_neg_req(wpa_s, src, dev_passwd_id);
+       wpas_dbus_signal_p2p_go_neg_req(wpa_s, src, dev_passwd_id, go_intent);
 }
 
 
@@ -618,13 +668,21 @@ void wpas_notify_p2p_provision_discovery(struct wpa_supplicant *wpa_s,
 
 
 void wpas_notify_p2p_group_started(struct wpa_supplicant *wpa_s,
-                                  struct wpa_ssid *ssid, int network_id,
+                                  struct wpa_ssid *ssid, int persistent,
                                   int client)
 {
        /* Notify a group has been started */
        wpas_dbus_register_p2p_group(wpa_s, ssid);
 
-       wpas_dbus_signal_p2p_group_started(wpa_s, ssid, client, network_id);
+       wpas_dbus_signal_p2p_group_started(wpa_s, client, persistent);
+}
+
+
+void wpas_notify_p2p_group_formation_failure(struct wpa_supplicant *wpa_s,
+                                            const char *reason)
+{
+       /* Notify a group formation failed */
+       wpas_dbus_signal_p2p_group_formation_failure(wpa_s, reason);
 }
 
 
@@ -634,6 +692,16 @@ void wpas_notify_p2p_wps_failed(struct wpa_supplicant *wpa_s,
        wpas_dbus_signal_p2p_wps_failed(wpa_s, fail);
 }
 
+
+void 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)
+{
+       /* Notify a P2P Invitation Request */
+       wpas_dbus_signal_p2p_invitation_received(wpa_s, sa, go_dev_addr, bssid,
+                                                id, op_freq);
+}
+
 #endif /* CONFIG_P2P */
 
 
@@ -687,13 +755,13 @@ void wpas_notify_sta_authorized(struct wpa_supplicant *wpa_s,
 
 
 void wpas_notify_certification(struct wpa_supplicant *wpa_s, int depth,
-                              const char *subject, const char *cert_hash,
+                              const char *subject, const char *altsubject[],
+                              int num_altsubject, const char *cert_hash,
                               const struct wpabuf *cert)
 {
        wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_EAP_PEER_CERT
                "depth=%d subject='%s'%s%s",
-               depth, subject,
-               cert_hash ? " hash=" : "",
+               depth, subject, cert_hash ? " hash=" : "",
                cert_hash ? cert_hash : "");
 
        if (cert) {
@@ -711,11 +779,20 @@ void wpas_notify_certification(struct wpa_supplicant *wpa_s, int depth,
                }
        }
 
+       if (altsubject) {
+               int i;
+
+               for (i = 0; i < num_altsubject; i++)
+                       wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_EAP_PEER_ALT
+                               "depth=%d %s", depth, altsubject[i]);
+       }
+
        /* notify the old DBus API */
        wpa_supplicant_dbus_notify_certification(wpa_s, depth, subject,
                                                 cert_hash, cert);
        /* notify the new DBus API */
-       wpas_dbus_signal_certification(wpa_s, depth, subject, cert_hash, cert);
+       wpas_dbus_signal_certification(wpa_s, depth, subject, altsubject,
+                                      num_altsubject, cert_hash, cert);
 }
 
 
@@ -752,3 +829,24 @@ void wpas_notify_network_bssid_set_changed(struct wpa_supplicant *wpa_s,
        wpa_drv_roaming(wpa_s, !ssid->bssid_set,
                        ssid->bssid_set ? ssid->bssid : NULL);
 }
+
+
+void wpas_notify_network_type_changed(struct wpa_supplicant *wpa_s,
+                                     struct wpa_ssid *ssid)
+{
+#ifdef CONFIG_P2P
+       if (ssid->disabled == 2) {
+               /* Changed from normal network profile to persistent group */
+               ssid->disabled = 0;
+               wpas_dbus_unregister_network(wpa_s, ssid->id);
+               ssid->disabled = 2;
+               ssid->p2p_persistent_group = 1;
+               wpas_dbus_register_persistent_group(wpa_s, ssid);
+       } else {
+               /* Changed from persistent group to normal network profile */
+               wpas_dbus_unregister_persistent_group(wpa_s, ssid->id);
+               ssid->p2p_persistent_group = 0;
+               wpas_dbus_register_network(wpa_s, ssid);
+       }
+#endif /* CONFIG_P2P */
+}