[PATCH 1/3] station: Add Utilization/SNR/LastSeen to station diagnostics
James Prestwood <[email protected]> Thu, 9 Jul 2026 14:45:44 -0700
| Newsgroups | dev.linux.lists.iwd |
|---|---|
| Message-ID | <[email protected]> |
For metric gathering and general debugging its convenient to query
the last known utilization and/or SNR from the currently connected
BSS. In addition another property was added, "BssLastSeen" which is
the seconds since the last scan returned the BSS. Since the
BSS's beacon info (like utilization/SNR) are only updated upon
getting scan results we need to also advertise the "age" of the
data so any consumers can decide whether or not to ignore these
values if they are too old.
---
src/station.c | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/src/station.c b/src/station.c
index 8fcf8c70..05ed043e 100644
--- a/src/station.c
+++ b/src/station.c
@@ -5337,6 +5337,14 @@ static void station_destroy_interface(void *user_data)
station_free(station);
}
+/* Gets the time in seconds since the BSS was last seen */
+static uint32_t bss_last_seen_time(const struct scan_bss *bss)
+{
+ uint64_t diff = l_time_diff(bss->time_stamp, l_time_now());
+
+ return (uint32_t)l_time_to_secs(diff);
+}
+
static void station_get_diagnostic_cb(
const struct diagnostic_station_info *info,
void *user_data)
@@ -5346,6 +5354,7 @@ static void station_get_diagnostic_cb(
struct l_dbus_message_builder *builder;
struct handshake_state *hs = netdev_get_handshake(station->netdev);
uint16_t channel_num;
+ uint32_t last_seen;
if (!info) {
reply = dbus_error_aborted(station->get_station_pending);
@@ -5388,6 +5397,23 @@ static void station_get_diagnostic_cb(
's', str);
}
+ if (station->connected_bss->have_utilization) {
+ uint8_t percent =
+ (station->connected_bss->utilization * 100) / 255;
+ dbus_append_dict_basic(builder, "ChannelUtilization", 'y',
+ &percent);
+ }
+
+ if (station->connected_bss->have_snr) {
+ uint8_t snr = (uint8_t)station->connected_bss->snr;
+ dbus_append_dict_basic(builder, "SignalNoiseRatio", 'y', &snr);
+ }
+
+ last_seen = bss_last_seen_time(station->connected_bss);
+
+ dbus_append_dict_basic(builder, "BssLastSeen", 'u',
+ &last_seen);
+
diagnostic_info_to_dict(info, builder);
l_dbus_message_builder_leave_array(builder);
--
2.34.1