Message ID | 20201103075416.14480-1-andrei.otcheretianski@intel.com |
---|---|
State | Accepted |
Headers | show |
Series | [v3] driver_nl80211: report invalid signal and noise when info is unavailable | expand |
On Mon, Nov 2, 2020 at 11:55 PM Andrei Otcheretianski <andrei.otcheretianski@intel.com> wrote: > From: Avraham Stern <avraham.stern@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@intel.com> > Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com> Thanks! Reviewed-by: Brian Norris <briannorris@chromium.org>
On Tue, Nov 03, 2020 at 09:54:16AM +0200, Andrei Otcheretianski wrote: > 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. Thanks, applied.
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..2cbe86cb5b 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 && new_level < 0) bss->level = new_level; }