git: 075a75efa6f6 - main - LinuxKPI: 802.11: improve scanning when not using the net80211 chanlist
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 29 Aug 2025 13:19:01 UTC
The branch main has been updated by bz: URL: https://cgit.FreeBSD.org/src/commit/?id=075a75efa6f6c9c95f53e0810a9029bcb0667138 commit 075a75efa6f6c9c95f53e0810a9029bcb0667138 Author: Bjoern A. Zeeb <bz@FreeBSD.org> AuthorDate: 2025-08-27 07:19:32 +0000 Commit: Bjoern A. Zeeb <bz@FreeBSD.org> CommitDate: 2025-08-29 13:18:42 +0000 LinuxKPI: 802.11: improve scanning when not using the net80211 chanlist With the option to not use the net80211 scan list but scan all channels (if we can scan all bands at once, etc.) we possibly scanned more channels than needed (or we should have). Add a helper function to sort out disabled channels and channels which are not on the net80211 ic_chan_active list (e.g. removed by regdomain). This could potentially also remove channels for a 2nd band for software scanning, but in the offload cases it should not. Add scan logging for the disabled channels and add scan logging to print the finalized channel list we are using for this scan (as net80211 has a similar logging). Sponsored by: The FreeBSD Foundation MFC after: 3 days --- sys/compat/linuxkpi/common/src/linux_80211.c | 63 +++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 10 deletions(-) diff --git a/sys/compat/linuxkpi/common/src/linux_80211.c b/sys/compat/linuxkpi/common/src/linux_80211.c index 1f7a0fa9d9b0..4ac2482e4138 100644 --- a/sys/compat/linuxkpi/common/src/linux_80211.c +++ b/sys/compat/linuxkpi/common/src/linux_80211.c @@ -4413,15 +4413,31 @@ lkpi_scan_chan_list_resort(struct linuxkpi_ieee80211_channel **cpp, size_t nchan } } } +} -#if 0 - printf("SCANLIST (nchan=%zu):", nchan); - for (i = 0; i < nchan; i++) { - lc = *(cpp + i); - printf(" %d", ieee80211_mhz2ieee(lc->center_freq, lkpi_nl80211_band_to_net80211_band(lc->band))); +static bool +lkpi_scan_chan(struct linuxkpi_ieee80211_channel *c, + struct ieee80211com *ic, bool log) +{ + + if ((c->flags & IEEE80211_CHAN_DISABLED) != 0) { + if (log) + TRACE_SCAN(ic, "Skipping disabled chan " + "on band %s [%#x/%u/%#x]", + lkpi_nl80211_band_name(c->band), c->hw_value, + c->center_freq, c->flags); + return (false); } - printf("\n"); -#endif + if (isclr(ic->ic_chan_active, ieee80211_mhz2ieee(c->center_freq, + lkpi_nl80211_band_to_net80211_band(c->band)))) { + if (log) + TRACE_SCAN(ic, "Skipping !active chan " + "on band %s [%#x/%u/%#x]", + lkpi_nl80211_band_name(c->band), c->hw_value, + c->center_freq, c->flags); + return (false); + } + return (true); } #endif @@ -4529,8 +4545,17 @@ sw_scan: continue; } if (hw->wiphy->bands[band] != NULL) { - nchan += hw->wiphy->bands[band]->n_channels; + struct linuxkpi_ieee80211_channel *channels; + int n; + band_mask |= (1 << band); + + channels = hw->wiphy->bands[band]->channels; + n = hw->wiphy->bands[band]->n_channels; + for (i = 0; i < n; i++) { + if (lkpi_scan_chan(&channels[i], ic, true)) + nchan++; + } } } #endif @@ -4639,11 +4664,29 @@ sw_scan: continue; channels = supband->channels; - for (i = 0; i < supband->n_channels; i++) - *(cpp + n++) = &channels[i]; + for (i = 0; i < supband->n_channels; i++) { + if (lkpi_scan_chan(&channels[i], ic, false)) + *(cpp + n++) = &channels[i]; + } } if (lkpi_order_scanlist) lkpi_scan_chan_list_resort(cpp, nchan); + + if ((linuxkpi_debug_80211 & D80211_SCAN) != 0) { + printf("%s:%d: %s SCAN Channel List (nchan=%zu): ", + __func__, __LINE__, ic->ic_name, nchan); + for (i = 0; i < nchan; i++) { + struct linuxkpi_ieee80211_channel *xc; + + xc = *(cpp + i); + printf(" %d(%d)", + ieee80211_mhz2ieee(xc->center_freq, + lkpi_nl80211_band_to_net80211_band( + xc->band)), + xc->center_freq); + } + printf("\n"); + } #endif hw_req->req.n_ssids = ssid_count;