]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
dbus: Export roam time, roam complete, and session length
authorMatthew Wang <matthewmwang@chromium.org>
Wed, 20 Jun 2018 23:42:45 +0000 (16:42 -0700)
committerJouni Malinen <j@w1.fi>
Wed, 2 Jan 2019 22:20:34 +0000 (00:20 +0200)
Add new Interface properties "RoamTime", "RoamComplete", and
"SessionLength". "RoamTime" carries the roam time of the most recent
roam in milliseconds. "RoamComplete" carries True or False corresponding
to the success status of the most recent roam. "SessionLength" carries
the number of milliseconds corresponding to how long the connection to
the last AP was before a roam or disconnect happened.

Signed-off-by: Matthew Wang <matthewmwang@chromium.org>
doc/dbus.doxygen
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.c
wpa_supplicant/wpa_supplicant_i.h

index 940f469d1f83bf98efe0ac924a59d87fffbf4754..3e924862ed8ee114e33cbd236a2b651608450f08 100644 (file)
@@ -774,6 +774,21 @@ fi.w1.wpa_supplicant1.CreateInterface.
        <p>The most recent IEEE 802.11 status code for association rejection.</p>
       </li>
 
+      <li>
+       <h3>RoamTime - u - (read)</h3>
+       <p>The most recent roam time in milliseconds.</p>
+      </li>
+
+      <li>
+       <h3>RoamComplete - b - (read)</h3>
+       <p>The most recent roam success or failure.</p>
+      </li>
+
+      <li>
+       <h3>SessionLength - u - (read)</h3>
+       <p>The most recent BSS session length in milliseconds.</p>
+      </li>
+
       <li>
        <h3>EapolVersion - s - (read/write)</h3>
        <p>IEEE 802.1X/EAPOL version number</p>
index 13b1de8a782fc709c36970ae49ec276fadb2e683..04e1b6a1083a9f3fea73b070befa85feebf0896a 100644 (file)
@@ -2235,6 +2235,15 @@ void wpas_dbus_signal_prop_changed(struct wpa_supplicant *wpa_s,
                prop = "AssocStatusCode";
                flush = TRUE;
                break;
+       case WPAS_DBUS_PROP_ROAM_TIME:
+               prop = "RoamTime";
+               break;
+       case WPAS_DBUS_PROP_ROAM_COMPLETE:
+               prop = "RoamComplete";
+               break;
+       case WPAS_DBUS_PROP_SESSION_LENGTH:
+               prop = "SessionLength";
+               break;
        default:
                wpa_printf(MSG_ERROR, "dbus: %s: Unknown Property value %d",
                           __func__, property);
@@ -2839,6 +2848,24 @@ static const struct wpa_dbus_property_desc wpas_dbus_bss_properties[] = {
          NULL,
          NULL
        },
+       {
+         "RoamTime", WPAS_DBUS_NEW_IFACE_INTERFACE, "u",
+         wpas_dbus_getter_roam_time,
+         NULL,
+         NULL
+       },
+       {
+         "RoamComplete", WPAS_DBUS_NEW_IFACE_INTERFACE, "b",
+         wpas_dbus_getter_roam_complete,
+         NULL,
+         NULL
+       },
+       {
+         "SessionLength", WPAS_DBUS_NEW_IFACE_INTERFACE, "u",
+         wpas_dbus_getter_session_length,
+         NULL,
+         NULL
+       },
        { NULL, NULL, NULL, NULL, NULL, NULL }
 };
 
index be2ce0d335b99eba8c600b82b3f3c011c737addc..67d0f57ca44b94c78d1a07236b8298a96867a4e6 100644 (file)
@@ -31,6 +31,9 @@ enum wpas_dbus_prop {
        WPAS_DBUS_PROP_STATIONS,
        WPAS_DBUS_PROP_DISCONNECT_REASON,
        WPAS_DBUS_PROP_ASSOC_STATUS_CODE,
+       WPAS_DBUS_PROP_ROAM_TIME,
+       WPAS_DBUS_PROP_ROAM_COMPLETE,
+       WPAS_DBUS_PROP_SESSION_LENGTH,
 };
 
 enum wpas_dbus_bss_prop {
index 3849ba461bbc4c982f955e6b828f2e28eabb6d1b..d2b86c1dee37c6495c50afb5443764689aa56d9b 100644 (file)
@@ -3113,6 +3113,71 @@ dbus_bool_t wpas_dbus_getter_assoc_status_code(
 }
 
 
+/**
+ * wpas_dbus_getter_roam_time - Get most recent roam time
+ * @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 "RoamTime" property.
+ */
+dbus_bool_t wpas_dbus_getter_roam_time(
+       const struct wpa_dbus_property_desc *property_desc,
+       DBusMessageIter *iter, DBusError *error, void *user_data)
+{
+       struct wpa_supplicant *wpa_s = user_data;
+       dbus_uint32_t roam_time = wpa_s->roam_time.sec * 1000 +
+               wpa_s->roam_time.usec / 1000;
+
+       return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32,
+                                               &roam_time, error);
+}
+
+
+/**
+ * wpas_dbus_getter_roam_complete - Get most recent roam success or failure
+ * @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 "RoamComplete" property.
+ */
+dbus_bool_t wpas_dbus_getter_roam_complete(
+       const struct wpa_dbus_property_desc *property_desc,
+       DBusMessageIter *iter, DBusError *error, void *user_data)
+{
+       struct wpa_supplicant *wpa_s = user_data;
+       dbus_bool_t roam_complete = os_reltime_initialized(&wpa_s->roam_time);
+
+       return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
+                                               &roam_complete, error);
+}
+
+
+/**
+ * wpas_dbus_getter_session_length - Get most recent BSS session length
+ * @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 "SessionLength" property.
+ */
+dbus_bool_t wpas_dbus_getter_session_length(
+       const struct wpa_dbus_property_desc *property_desc,
+       DBusMessageIter *iter, DBusError *error, void *user_data)
+{
+       struct wpa_supplicant *wpa_s = user_data;
+       dbus_uint32_t session_length = wpa_s->session_length.sec * 1000 +
+               wpa_s->session_length.usec / 1000;
+
+       return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32,
+                                               &session_length, error);
+}
+
+
 /**
  * wpas_dbus_getter_bss_expire_age - Get BSS entry expiration age
  * @iter: Pointer to incoming dbus message iter
index 1907a8a516e26565598695255cae4d1b611d0ebe..19d03446c05ef27db018b0b4d5afc311a5a218a4 100644 (file)
@@ -151,6 +151,9 @@ DECLARE_ACCESSOR(wpas_dbus_setter_fast_reauth);
 DECLARE_ACCESSOR(wpas_dbus_getter_disconnect_reason);
 DECLARE_ACCESSOR(wpas_dbus_getter_disassociate_reason);
 DECLARE_ACCESSOR(wpas_dbus_getter_assoc_status_code);
+DECLARE_ACCESSOR(wpas_dbus_getter_roam_time);
+DECLARE_ACCESSOR(wpas_dbus_getter_roam_complete);
+DECLARE_ACCESSOR(wpas_dbus_getter_session_length);
 DECLARE_ACCESSOR(wpas_dbus_getter_bss_expire_age);
 DECLARE_ACCESSOR(wpas_dbus_setter_bss_expire_age);
 DECLARE_ACCESSOR(wpas_dbus_getter_bss_expire_count);
index aacaed154a233d50d743e11f358d94138fbb09b7..f54ec7acd5bae85a71c369cb85c092422a9c1b1a 100644 (file)
@@ -293,6 +293,13 @@ void wpa_supplicant_mark_disassoc(struct wpa_supplicant *wpa_s)
        if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED)
                return;
 
+       if (os_reltime_initialized(&wpa_s->session_start)) {
+               os_reltime_age(&wpa_s->session_start, &wpa_s->session_length);
+               wpa_s->session_start.sec = 0;
+               wpa_s->session_start.usec = 0;
+               wpas_notify_session_length(wpa_s);
+       }
+
        wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
        bssid_changed = !is_zero_ether_addr(wpa_s->bssid);
        os_memset(wpa_s->bssid, 0, ETH_ALEN);
@@ -2698,6 +2705,16 @@ static void wpa_supplicant_event_assoc(struct wpa_supplicant *wpa_s,
 
        wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATED);
        if (os_memcmp(bssid, wpa_s->bssid, ETH_ALEN) != 0) {
+               if (os_reltime_initialized(&wpa_s->session_start)) {
+                       os_reltime_age(&wpa_s->session_start,
+                                      &wpa_s->session_length);
+                       wpa_s->session_start.sec = 0;
+                       wpa_s->session_start.usec = 0;
+                       wpas_notify_session_length(wpa_s);
+               } else {
+                       wpas_notify_auth_changed(wpa_s);
+                       os_get_reltime(&wpa_s->session_start);
+               }
                wpa_dbg(wpa_s, MSG_DEBUG, "Associated to a new BSS: BSSID="
                        MACSTR, MAC2STR(bssid));
                new_bss = 1;
index 75f762dafc10fe8d7ee367bc86c904babcac6d3f..a9d567114161ac5b6050112885dbcebe63deeb8c 100644 (file)
@@ -149,6 +149,33 @@ void wpas_notify_assoc_status_code(struct wpa_supplicant *wpa_s)
 }
 
 
+void wpas_notify_roam_time(struct wpa_supplicant *wpa_s)
+{
+       if (wpa_s->p2p_mgmt)
+               return;
+
+       wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_ROAM_TIME);
+}
+
+
+void wpas_notify_roam_complete(struct wpa_supplicant *wpa_s)
+{
+       if (wpa_s->p2p_mgmt)
+               return;
+
+       wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_ROAM_COMPLETE);
+}
+
+
+void wpas_notify_session_length(struct wpa_supplicant *wpa_s)
+{
+       if (wpa_s->p2p_mgmt)
+               return;
+
+       wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_SESSION_LENGTH);
+}
+
+
 void wpas_notify_network_changed(struct wpa_supplicant *wpa_s)
 {
        if (wpa_s->p2p_mgmt)
index 3ca933c7621a5fdbaede958d5b86badcc944ab66..bde20e83d220fcc53d0cc4c121e8700d1d5cc0e7 100644 (file)
@@ -24,6 +24,9 @@ void wpas_notify_state_changed(struct wpa_supplicant *wpa_s,
                               enum wpa_states old_state);
 void wpas_notify_disconnect_reason(struct wpa_supplicant *wpa_s);
 void wpas_notify_assoc_status_code(struct wpa_supplicant *wpa_s);
+void wpas_notify_roam_time(struct wpa_supplicant *wpa_s);
+void wpas_notify_roam_complete(struct wpa_supplicant *wpa_s);
+void wpas_notify_session_length(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 88d4a0487d651c8fa4abada0d484093e1f953574..b990e94adeddb9b3ecb52a8310a9245d917d9467 100644 (file)
@@ -846,6 +846,23 @@ void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s,
                wpa_supplicant_state_txt(wpa_s->wpa_state),
                wpa_supplicant_state_txt(state));
 
+       if (state == WPA_COMPLETED &&
+           os_reltime_initialized(&wpa_s->roam_start)) {
+               os_reltime_age(&wpa_s->roam_start, &wpa_s->roam_time);
+               wpa_s->roam_start.sec = 0;
+               wpa_s->roam_start.usec = 0;
+               wpas_notify_auth_changed(wpa_s);
+               wpas_notify_roam_time(wpa_s);
+               wpas_notify_roam_complete(wpa_s);
+       } else if (state == WPA_DISCONNECTED &&
+                  os_reltime_initialized(&wpa_s->roam_start)) {
+               wpa_s->roam_start.sec = 0;
+               wpa_s->roam_start.usec = 0;
+               wpa_s->roam_time.sec = 0;
+               wpa_s->roam_time.usec = 0;
+               wpas_notify_roam_complete(wpa_s);
+       }
+
        if (state == WPA_INTERFACE_DISABLED) {
                /* Assure normal scan when interface is restored */
                wpa_s->normal_scans = 0;
@@ -1904,6 +1921,8 @@ void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,
                if (wpa_s->current_bss && wpa_s->current_bss == bss) {
                        wmm_ac_save_tspecs(wpa_s);
                        wpa_s->reassoc_same_bss = 1;
+               } else if (wpa_s->current_bss && wpa_s->current_bss != bss) {
+                       os_get_reltime(&wpa_s->roam_start);
                }
        }
 
index c2298a216eb881fc24e0894b13c300de014d8afc..6bedcdd90946f47d61002f0378d4889cdee175d5 100644 (file)
@@ -494,6 +494,10 @@ struct wpa_supplicant {
        struct wpa_supplicant *next;
        struct l2_packet_data *l2;
        struct l2_packet_data *l2_br;
+       struct os_reltime roam_start;
+       struct os_reltime roam_time;
+       struct os_reltime session_start;
+       struct os_reltime session_length;
        unsigned char own_addr[ETH_ALEN];
        unsigned char perm_addr[ETH_ALEN];
        char ifname[100];