]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
Export disconnect reason code to dbus
authorGary Morain <gmorain@chromium.org>
Sat, 30 Jun 2012 13:43:50 +0000 (16:43 +0300)
committerJouni Malinen <j@w1.fi>
Sat, 30 Jun 2012 13:43:50 +0000 (16:43 +0300)
In the properties changed signal, added a new property
"DisconnectReason", which carries the IEEE 802.11 reason code of the
most recent disassociation or deauthentication event. The reason code is
negative if it is locally generated. The property is sent to the DBUS
immediately so as to prevent it from being coalesced with other
disconnect events.

Signed-off-by: Gary Morain <gmorain@chromium.org>
wpa_supplicant/dbus/dbus_new.c
wpa_supplicant/dbus/dbus_new.h
wpa_supplicant/dbus/dbus_new_handlers.c
wpa_supplicant/dbus/dbus_new_handlers.h
wpa_supplicant/events.c
wpa_supplicant/notify.c
wpa_supplicant/notify.h
wpa_supplicant/wpa_supplicant_i.h

index a8e87d5a7cdf715005bbe94e34e491774bc192d7..fcdf995e3b5635da1f223428a1a1398cb4cbb516 100644 (file)
@@ -1735,10 +1735,12 @@ void wpas_dbus_signal_prop_changed(struct wpa_supplicant *wpa_s,
                                   enum wpas_dbus_prop property)
 {
        char *prop;
+       dbus_bool_t flush;
 
        if (wpa_s->dbus_new_path == NULL)
                return; /* Skip signal since D-Bus setup is not yet ready */
 
+       flush = FALSE;
        switch (property) {
        case WPAS_DBUS_PROP_AP_SCAN:
                prop = "ApScan";
@@ -1761,6 +1763,10 @@ void wpas_dbus_signal_prop_changed(struct wpa_supplicant *wpa_s,
        case WPAS_DBUS_PROP_CURRENT_AUTH_MODE:
                prop = "CurrentAuthMode";
                break;
+       case WPAS_DBUS_PROP_DISCONNECT_REASON:
+               prop = "DisconnectReason";
+               flush = TRUE;
+               break;
        default:
                wpa_printf(MSG_ERROR, "dbus: %s: Unknown Property value %d",
                           __func__, property);
@@ -1770,6 +1776,10 @@ void wpas_dbus_signal_prop_changed(struct wpa_supplicant *wpa_s,
        wpa_dbus_mark_property_changed(wpa_s->global->dbus,
                                       wpa_s->dbus_new_path,
                                       WPAS_DBUS_NEW_IFACE_INTERFACE, prop);
+       if (flush) {
+               wpa_dbus_flush_object_changed_properties(
+                       wpa_s->global->dbus->con, wpa_s->dbus_new_path);
+       }
 }
 
 
@@ -2746,6 +2756,10 @@ static const struct wpa_dbus_property_desc wpas_dbus_interface_properties[] = {
          NULL
        },
 #endif /* CONFIG_P2P */
+       { "DisconnectReason", WPAS_DBUS_NEW_IFACE_INTERFACE, "i",
+         wpas_dbus_getter_disconnect_reason,
+         NULL
+       },
        { NULL, NULL, NULL, NULL, NULL }
 };
 
index 4d322a1e84b6e9f93e34faa36e0259be45c92245..3b632c43624baad972d29b90c3891fabbf242c07 100644 (file)
@@ -34,6 +34,7 @@ enum wpas_dbus_prop {
        WPAS_DBUS_PROP_CURRENT_NETWORK,
        WPAS_DBUS_PROP_CURRENT_AUTH_MODE,
        WPAS_DBUS_PROP_BSSS,
+       WPAS_DBUS_PROP_DISCONNECT_REASON,
 };
 
 enum wpas_dbus_bss_prop {
index bde2aff2730b0344d6ba561ecb394f3a4c292e98..58b941ccecdf872adbdff6b2fa68c8ba0698fa76 100644 (file)
@@ -2351,6 +2351,27 @@ dbus_bool_t wpas_dbus_setter_fast_reauth(DBusMessageIter *iter,
 }
 
 
+/**
+ * wpas_dbus_getter_disconnect_reason - Get most recent reason for disconnect
+ * @iter: Pointer to incoming dbus message iter
+ * @error: Location to store error on failure
+ * @user_data: Function specific data
+ * Returns: TRUE on success, FALSE on failure
+ *
+ * Getter for "DisconnectReason" property.  The reason is negative if it is
+ * locally generated.
+ */
+dbus_bool_t wpas_dbus_getter_disconnect_reason(DBusMessageIter *iter,
+                                              DBusError *error,
+                                              void *user_data)
+{
+       struct wpa_supplicant *wpa_s = user_data;
+       dbus_int32_t reason = wpa_s->disconnect_reason;
+       return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32,
+                                               &reason, error);
+}
+
+
 /**
  * wpas_dbus_getter_bss_expire_age - Get BSS entry expiration age
  * @iter: Pointer to incoming dbus message iter
index 8cba72406d10830f878367383c2b9e03be108672..80a061f9c4f8d9e62e9a740cc2a31f1773f61efd 100644 (file)
@@ -150,6 +150,10 @@ dbus_bool_t wpas_dbus_setter_fast_reauth(DBusMessageIter *iter,
                                         DBusError *error,
                                         void *user_data);
 
+dbus_bool_t wpas_dbus_getter_disconnect_reason(DBusMessageIter *iter,
+                                              DBusError *error,
+                                              void *user_data);
+
 dbus_bool_t wpas_dbus_getter_bss_expire_age(DBusMessageIter *iter,
                                            DBusError *error, void *user_data);
 
index 513a8e870980fb0669c753ef42e777e11d3cf1c8..6685b6b257171031ecb064ebfcfa28e57fb08b65 100644 (file)
@@ -1761,6 +1761,11 @@ static void wpa_supplicant_event_disassoc(struct wpa_supplicant *wpa_s,
        if (wpa_s->wpa_state >= WPA_AUTHENTICATING)
                wpas_connection_failed(wpa_s, bssid);
        wpa_sm_notify_disassoc(wpa_s->wpa);
+       if (locally_generated)
+               wpa_s->disconnect_reason = -reason_code;
+       else
+               wpa_s->disconnect_reason = reason_code;
+       wpas_notify_disconnect_reason(wpa_s);
        if (!is_zero_ether_addr(bssid) ||
            wpa_s->wpa_state >= WPA_AUTHENTICATING) {
                wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_DISCONNECTED "bssid=" MACSTR
index c4d7e939fc2b01073a20e47e144223ab18547f1e..0ede0d0fba1cab8c9aaab880c36d3f210c73d45f 100644 (file)
@@ -97,6 +97,12 @@ void wpas_notify_state_changed(struct wpa_supplicant *wpa_s,
 }
 
 
+void wpas_notify_disconnect_reason(struct wpa_supplicant *wpa_s)
+{
+       wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_DISCONNECT_REASON);
+}
+
+
 void wpas_notify_network_changed(struct wpa_supplicant *wpa_s)
 {
        wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_CURRENT_NETWORK);
index e2bf788422e0fdae8d1e2b8e461a3470980865af..58675ac0ce97e76849484f8763bde8afa14a04e8 100644 (file)
@@ -22,6 +22,7 @@ void wpas_notify_iface_removed(struct wpa_supplicant *wpa_s);
 void wpas_notify_state_changed(struct wpa_supplicant *wpa_s,
                               enum wpa_states new_state,
                               enum wpa_states old_state);
+void wpas_notify_disconnect_reason(struct wpa_supplicant *wpa_s);
 void wpas_notify_network_changed(struct wpa_supplicant *wpa_s);
 void wpas_notify_ap_scan_changed(struct wpa_supplicant *wpa_s);
 void wpas_notify_bssid_changed(struct wpa_supplicant *wpa_s);
index 2d6ee3897c53e5b6c2cc664727ca9a0a4e9c06c3..b608f29872e4fa486b7b7835550273360b7dc454 100644 (file)
@@ -571,6 +571,9 @@ struct wpa_supplicant {
        } hw;
 
        int pno;
+
+       /* WLAN_REASON_* reason codes. Negative if locally generated. */
+       int disconnect_reason;
 };