On Wed, 2018-06-20 at 16:42 -0700, Matthew Wang wrote: > Added 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. D-Bus bits look fine to me, FWIW. Dan > Signed-off-by: Matthew Wang <matthewmwang@xxxxxxxxxxxx> > --- > doc/dbus.doxygen | 15 ++++++ > wpa_supplicant/dbus/dbus_new.c | 27 ++++++++++ > wpa_supplicant/dbus/dbus_new.h | 3 ++ > wpa_supplicant/dbus/dbus_new_handlers.c | 65 > +++++++++++++++++++++++++ > wpa_supplicant/dbus/dbus_new_handlers.h | 3 ++ > wpa_supplicant/events.c | 16 ++++++ > wpa_supplicant/notify.c | 27 ++++++++++ > wpa_supplicant/notify.h | 3 ++ > wpa_supplicant/wpa_supplicant.c | 19 ++++++++ > wpa_supplicant/wpa_supplicant_i.h | 4 ++ > 10 files changed, 182 insertions(+) > > diff --git a/doc/dbus.doxygen b/doc/dbus.doxygen > index 2ca40ae9b..64d2d0985 100644 > --- a/doc/dbus.doxygen > +++ b/doc/dbus.doxygen > @@ -769,6 +769,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> > diff --git a/wpa_supplicant/dbus/dbus_new.c > b/wpa_supplicant/dbus/dbus_new.c > index e0f16bbda..a50c7a540 100644 > --- a/wpa_supplicant/dbus/dbus_new.c > +++ b/wpa_supplicant/dbus/dbus_new.c > @@ -2162,6 +2162,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); > @@ -2731,6 +2740,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 } > }; > > diff --git a/wpa_supplicant/dbus/dbus_new.h > b/wpa_supplicant/dbus/dbus_new.h > index e68acb7a1..08f4858b1 100644 > --- a/wpa_supplicant/dbus/dbus_new.h > +++ b/wpa_supplicant/dbus/dbus_new.h > @@ -31,6 +31,9 @@ enum wpas_dbus_prop { > WPAS_DBUS_PROP_BSSS, > 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 { > diff --git a/wpa_supplicant/dbus/dbus_new_handlers.c > b/wpa_supplicant/dbus/dbus_new_handlers.c > index a3c98fadd..e84acf230 100644 > --- a/wpa_supplicant/dbus/dbus_new_handlers.c > +++ b/wpa_supplicant/dbus/dbus_new_handlers.c > @@ -3158,6 +3158,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) ? > + TRUE : FALSE; > + > + 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 > diff --git a/wpa_supplicant/dbus/dbus_new_handlers.h > b/wpa_supplicant/dbus/dbus_new_handlers.h > index 26652ad3d..7a03b7f9f 100644 > --- a/wpa_supplicant/dbus/dbus_new_handlers.h > +++ b/wpa_supplicant/dbus/dbus_new_handlers.h > @@ -148,6 +148,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); > diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c > index 2fa338100..68c3365ec 100644 > --- a/wpa_supplicant/events.c > +++ b/wpa_supplicant/events.c > @@ -290,6 +290,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); > @@ -2605,6 +2612,15 @@ 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; > diff --git a/wpa_supplicant/notify.c b/wpa_supplicant/notify.c > index 83df04f39..a2b04716d 100644 > --- a/wpa_supplicant/notify.c > +++ b/wpa_supplicant/notify.c > @@ -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) > diff --git a/wpa_supplicant/notify.h b/wpa_supplicant/notify.h > index 3ca933c76..bde20e83d 100644 > --- a/wpa_supplicant/notify.h > +++ b/wpa_supplicant/notify.h > @@ -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); > diff --git a/wpa_supplicant/wpa_supplicant.c > b/wpa_supplicant/wpa_supplicant.c > index dcd787bec..35ae3a479 100644 > --- a/wpa_supplicant/wpa_supplicant.c > +++ b/wpa_supplicant/wpa_supplicant.c > @@ -839,6 +839,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; > @@ -1864,6 +1881,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); > } > } > > diff --git a/wpa_supplicant/wpa_supplicant_i.h > b/wpa_supplicant/wpa_supplicant_i.h > index 4d18177fb..a4d56b810 100644 > --- a/wpa_supplicant/wpa_supplicant_i.h > +++ b/wpa_supplicant/wpa_supplicant_i.h > @@ -492,6 +492,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]; _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap