[PATCH v2] driver_nl80211: report invalid signal and noise when info is unavailable
Matthew Wang
matthewmwang at chromium.org
Mon Sep 28 23:52:21 EDT 2020
In wpa_bss_update_level, we should probably continue to check for
new_level < 0 as well as new_level > -WPA_INVALID_NOISE.
On Sun, Sep 13, 2020 at 6:00 AM Andrei Otcheretianski
<andrei.otcheretianski at intel.com> wrote:
>
> From: Avraham Stern <avraham.stern at intel.com>
>
> When the driver sends a CQM RSSI threshold event, wpa_supplicant
> queries the driver for the signal and noise values. However, it
> is possible that by that time the station has already disconnected
> from the AP, so these values are no longer valid. In this case,
> indicate that these values are invalid by setting them to
> WPA_INVALID_NOISE.
> Previously a value of 0 would be reported, which may be confusing as
> this is a valid value.
> Since nl80211_get_link_signal() and nl80211_get_link_noise() already
> set invalid values for a case of failure, just use the value set by
> these functions even if they fail.
>
> Signed-off-by: Avraham Stern <avraham.stern at intel.com>
> Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski at intel.com>
> ---
> src/drivers/driver_nl80211_event.c | 26 ++++++++++++++++----------
> wpa_supplicant/bss.h | 2 +-
> 2 files changed, 17 insertions(+), 11 deletions(-)
>
> diff --git a/src/drivers/driver_nl80211_event.c b/src/drivers/driver_nl80211_event.c
> index ce95e9cd39..31b2799535 100644
> --- a/src/drivers/driver_nl80211_event.c
> +++ b/src/drivers/driver_nl80211_event.c
> @@ -1277,7 +1277,6 @@ static void nl80211_cqm_event(struct wpa_driver_nl80211_data *drv,
> struct nlattr *cqm[NL80211_ATTR_CQM_MAX + 1];
> enum nl80211_cqm_rssi_threshold_event event;
> union wpa_event_data ed;
> - struct wpa_signal_info sig;
> int res;
>
> if (tb[NL80211_ATTR_CQM] == NULL ||
> @@ -1344,20 +1343,27 @@ static void nl80211_cqm_event(struct wpa_driver_nl80211_data *drv,
> return;
> }
>
> - res = nl80211_get_link_signal(drv, &sig);
> + /*
> + * nl80211_get_link_signal() and nl80211_get_link_noise() set default
> + * values in case querying the driver fails.
> + */
> + res = nl80211_get_link_signal(drv, &ed.signal_change);
> if (res == 0) {
> - ed.signal_change.current_signal = sig.current_signal;
> - ed.signal_change.current_txrate = sig.current_txrate;
> wpa_printf(MSG_DEBUG, "nl80211: Signal: %d dBm txrate: %d",
> - sig.current_signal, sig.current_txrate);
> + ed.signal_change.current_signal,
> + ed.signal_change.current_txrate);
> + } else {
> + wpa_printf(MSG_DEBUG,
> + "nl80211: querying the driver for signal info failed");
> }
>
> - res = nl80211_get_link_noise(drv, &sig);
> - if (res == 0) {
> - ed.signal_change.current_noise = sig.current_noise;
> + res = nl80211_get_link_noise(drv, &ed.signal_change);
> + if (res == 0)
> wpa_printf(MSG_DEBUG, "nl80211: Noise: %d dBm",
> - sig.current_noise);
> - }
> + ed.signal_change.current_noise);
> + else
> + wpa_printf(MSG_DEBUG,
> + "nl80211: querying the driver for noise info failed");
>
> wpa_supplicant_event(drv->ctx, EVENT_SIGNAL_CHANGE, &ed);
> }
> diff --git a/wpa_supplicant/bss.h b/wpa_supplicant/bss.h
> index 0716761749..750cdcbccc 100644
> --- a/wpa_supplicant/bss.h
> +++ b/wpa_supplicant/bss.h
> @@ -169,7 +169,7 @@ static inline int bss_is_pbss(struct wpa_bss *bss)
>
> static inline void wpa_bss_update_level(struct wpa_bss *bss, int new_level)
> {
> - if (bss != NULL && new_level < 0)
> + if (bss != NULL && new_level > -WPA_INVALID_NOISE)
> bss->level = new_level;
> }
>
> --
> 2.28.0
>
>
> _______________________________________________
> Hostap mailing list
> Hostap at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/hostap
More information about the Hostap
mailing list