On Thu, 2019-03-21 at 15:19 +0000, Sergey Matyukevich wrote:
> FullMAC STAs have no way to update bss channel after CSA channel switch
> completion. As a result, user-space tools may provide inconsistent
> channel info. For instance, consider the following two commands:
> $ sudo iw dev wlan0 link
> $ sudo iw dev wlan0 info
> The latter command gets channel info from the hardware, so most probably
> its output will be correct. However the former command gets channel info
> from scan cache, so its output will contain outdated channel info.
> In fact, current bss channel info will not be updated until the
> next [re-]connect.
>
> Note that mac80211 STAs have a workaround for this, but it requires
> access to internal cfg80211 data, see ieee80211_chswitch_work:
>
> /* XXX: shouldn't really modify cfg80211-owned data! */
> ifmgd->associated->channel = sdata->csa_chandef.chan;
>
> This patch suggests to convert mac80211 workaround to cfg80211 behavior
> and to update current bss channel in cfg80211_ch_switch_notify.
>
> Signed-off-by: Sergey Matyukevich <[email protected]>
>
> ---
>
> This issue has been observed for both qtnfmac and brcmfmac. Fix tested
> for qtnfmac and iwlwifi, to make sure there is no regression for mac80211.
> However this is not going to be enough to fix brcmfmac behavior as it
> does not use cfg80211_ch_switch_notify. This issue may also affect
> ath6kl and mwifiex, but I have no hardware to check.
Yeah, I think this makes sense.
> + if (wdev->iftype == NL80211_IFTYPE_STATION) {
> + if (wdev->current_bss)
> + wdev->current_bss->pub.channel = chandef->chan;
> + }
Maybe do
if (wdev->iftype == ... &&
!WARN_ON(!wdev->current_bss))
wdev->current_bss->... = ...
I worry slightly about locking too, since there's no protection on the
wdev->current_bss pointer here.
johannes