diff --git a/client/diagnostic.c b/client/diagnostic.c index 2be8b724..6bce1671 100644 --- a/client/diagnostic.c +++ b/client/diagnostic.c @@ -97,6 +97,9 @@ static const struct diagnostic_dict_mapping diagnostic_mapping[] = { { "Security", 's' }, { "InactiveTime", 'u', "ms" }, { "ConnectedTime", 'u', "s" }, + { "ChannelUtilization", 'y', "%" }, + { "SignalNoiseRatio", 'y', "dBm" }, + { "BssLastSeen", 'u', "s" }, { NULL } }; diff --git a/doc/station-diagnostic-api.txt b/doc/station-diagnostic-api.txt index 9b51d4b7..a946682e 100644 --- a/doc/station-diagnostic-api.txt +++ b/doc/station-diagnostic-api.txt @@ -27,6 +27,9 @@ Methods dict GetDiagnostics() Security - The chosen security for the connection. + BssLastSeen - The time in seconds since the BSS was seen + in a scan. + RSSI [optional] - The RSSI of the currently connected BSS. AverageRSSI [optional] - Average RSSI of currently connected BSS. @@ -59,6 +62,19 @@ Methods dict GetDiagnostics() ConnectedTime [optional] - Time Duration (in s) for which this STA remains connected to the BSS. + ChannelUtilization [optional] - The channel utilization + advertised by the BSS load element in scans. + Note the confidence of this value heavily + depends on the BssLastSeen time as this only + updates when IWD scans. + + SignalNoiseRatio [optional] - The signal to noise ratio + (SNR) received on the last scan. + Note the confidence of this value heavily + depends on the BssLastSeen time as this only + updates when IWD scans. + + Possible errors: net.connman.iwd.Busy net.connman.iwd.Failed net.connman.iwd.NotConnected 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);