]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
dbus: add BSS Age property to indicate last-seen time
authorDan Williams <dcbw@redhat.com>
Thu, 4 Sep 2014 18:10:54 +0000 (13:10 -0500)
committerJouni Malinen <j@w1.fi>
Sun, 7 Sep 2014 16:18:45 +0000 (19:18 +0300)
"Age" is the age in seconds since the BSS was last seen, and is
emitted as a PropertyChanged signal whenever the BSS is updated
from a scan result. It also returns the correct age when queried
directly.

This property can be used to resolve issues where, if no other
properties of the BSS changed from scan results (for example,
if the BSS always had 100% signal) no D-Bus signals would be
emitted to indicate that the BSS had just been seen in the scan.

Signed-hostap: Dan Williams <dcbw@redhat.com>

wpa_supplicant/bss.c
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/notify.c
wpa_supplicant/notify.h

index f99a8a71d144719d6747c9de6b8d7eff3474a4d3..7d01a5f01b6f92a379d6afb1ea1faccccba03825 100644 (file)
@@ -489,6 +489,8 @@ static void notify_bss_changes(struct wpa_supplicant *wpa_s, u32 changes,
 
        if (changes & WPA_BSS_RATES_CHANGED_FLAG)
                wpas_notify_bss_rates_changed(wpa_s, bss->id);
+
+       wpas_notify_bss_seen(wpa_s, bss->id);
 }
 
 
index e9f658909f5dcf1bc7896482f3dea9dea2da4a04..ab209614281be063eb5612972d65a30dcef259f2 100644 (file)
@@ -1960,6 +1960,9 @@ void wpas_dbus_bss_signal_prop_changed(struct wpa_supplicant *wpa_s,
        case WPAS_DBUS_BSS_PROP_IES:
                prop = "IEs";
                break;
+       case WPAS_DBUS_BSS_PROP_AGE:
+               prop = "Age";
+               break;
        default:
                wpa_printf(MSG_ERROR, "dbus: %s: Unknown Property value %d",
                           __func__, property);
@@ -2384,6 +2387,10 @@ static const struct wpa_dbus_property_desc wpas_dbus_bss_properties[] = {
          wpas_dbus_getter_bss_ies,
          NULL
        },
+       { "Age", WPAS_DBUS_NEW_IFACE_BSS, "u",
+         wpas_dbus_getter_bss_age,
+         NULL
+       },
        { NULL, NULL, NULL, NULL, NULL }
 };
 
index 881d351ddad9b6a58edb0fdfff3261121496df84..5f32bbf6b7ff3004da505a2ddece829bc1dd2ccf 100644 (file)
@@ -41,6 +41,7 @@ enum wpas_dbus_bss_prop {
        WPAS_DBUS_BSS_PROP_RSN,
        WPAS_DBUS_BSS_PROP_WPS,
        WPAS_DBUS_BSS_PROP_IES,
+       WPAS_DBUS_BSS_PROP_AGE,
 };
 
 #define WPAS_DBUS_OBJECT_PATH_MAX 150
index 6dc5f76d4caba9b182af0e2a87ebdf706f09c2d9..b7d88b46de4005f540627d02a2f2bd114015b697 100644 (file)
@@ -3954,6 +3954,35 @@ dbus_bool_t wpas_dbus_getter_bss_ies(DBusMessageIter *iter, DBusError *error,
 }
 
 
+/**
+ * wpas_dbus_getter_bss_age - Return time in seconds since BSS was last seen
+ * @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 BSS age
+ */
+dbus_bool_t wpas_dbus_getter_bss_age(DBusMessageIter *iter, DBusError *error,
+                                    void *user_data)
+{
+       struct bss_handler_args *args = user_data;
+       struct wpa_bss *res;
+       struct os_reltime now, diff = { 0, 0 };
+       u32 age;
+
+       res = get_bss_helper(args, error, __func__);
+       if (!res)
+               return FALSE;
+
+       os_get_reltime(&now);
+       os_reltime_sub(&now, &res->last_update, &diff);
+       age = diff.sec > 0 ? diff.sec : 0;
+       return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, &age,
+                                               error);
+}
+
+
 /**
  * wpas_dbus_getter_enabled - Check whether network is enabled or disabled
  * @iter: Pointer to incoming dbus message iter
index 461970d3f0fc2ae2988a0b4fd0c3ad72524d49fa..8d157edd9f3c6df7b8979fd566b225df6b44a9fc 100644 (file)
@@ -268,6 +268,9 @@ dbus_bool_t wpas_dbus_getter_bss_wps(DBusMessageIter *iter, DBusError *error,
 dbus_bool_t wpas_dbus_getter_bss_ies(DBusMessageIter *iter, DBusError *error,
                                     void *user_data);
 
+dbus_bool_t wpas_dbus_getter_bss_age(DBusMessageIter *iter, DBusError *error,
+                                    void *user_data);
+
 dbus_bool_t wpas_dbus_getter_enabled(DBusMessageIter *iter, DBusError *error,
                                     void *user_data);
 
index 3b730cf17830aac4916ffa6b89ee6119d28662d0..b29fdac6ddd4658649d4ab65810d9b2b377df300 100644 (file)
@@ -345,6 +345,12 @@ void wpas_notify_bss_rates_changed(struct wpa_supplicant *wpa_s,
 }
 
 
+void wpas_notify_bss_seen(struct wpa_supplicant *wpa_s, unsigned int id)
+{
+       wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_AGE, id);
+}
+
+
 void wpas_notify_blob_added(struct wpa_supplicant *wpa_s, const char *name)
 {
        wpas_dbus_signal_blob_added(wpa_s, name);
index 58675ac0ce97e76849484f8763bde8afa14a04e8..5dda608b4a0e088a0c90d0fc0613e325efd0cb7c 100644 (file)
@@ -71,6 +71,7 @@ void wpas_notify_bss_ies_changed(struct wpa_supplicant *wpa_s,
                                 unsigned int id);
 void wpas_notify_bss_rates_changed(struct wpa_supplicant *wpa_s,
                                   unsigned int id);
+void wpas_notify_bss_seen(struct wpa_supplicant *wpa_s, unsigned int id);
 void wpas_notify_blob_added(struct wpa_supplicant *wpa_s, const char *name);
 void wpas_notify_blob_removed(struct wpa_supplicant *wpa_s, const char *name);