mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-11-22 23:09:34 +01:00
scan: filter user-disabled bands for periodic scans.
To support user-disabled bands periodic scans need to specify a frequency list filtered by any bands that are disabled. This was needed in scan.c since periodic scans don't provide a frequency list in the scan request. If no bands are disabled the allowed freqs API should still result in the same scan behavior as if a frequency list is left out i.e. IWD just filters the frequencies as opposed to the kernel.
This commit is contained in:
parent
6463fa2561
commit
e83070e074
36
src/scan.c
36
src/scan.c
@ -987,9 +987,43 @@ static void scan_periodic_destroy(void *user_data)
|
|||||||
sc->sp.id = 0;
|
sc->sp.id = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct scan_freq_set *scan_periodic_get_freqs(struct scan_context *sc)
|
||||||
|
{
|
||||||
|
uint32_t band_mask = 0;
|
||||||
|
struct scan_freq_set *freqs;
|
||||||
|
const struct scan_freq_set *supported =
|
||||||
|
wiphy_get_supported_freqs(sc->wiphy);
|
||||||
|
|
||||||
|
if (RANK_2G_FACTOR)
|
||||||
|
band_mask |= BAND_FREQ_2_4_GHZ;
|
||||||
|
if (RANK_5G_FACTOR)
|
||||||
|
band_mask |= BAND_FREQ_5_GHZ;
|
||||||
|
if (RANK_6G_FACTOR)
|
||||||
|
band_mask |= BAND_FREQ_6_GHZ;
|
||||||
|
|
||||||
|
freqs = scan_freq_set_clone(supported, band_mask);
|
||||||
|
if (scan_freq_set_isempty(freqs)) {
|
||||||
|
scan_freq_set_free(freqs);
|
||||||
|
freqs = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return freqs;
|
||||||
|
}
|
||||||
|
|
||||||
static bool scan_periodic_queue(struct scan_context *sc)
|
static bool scan_periodic_queue(struct scan_context *sc)
|
||||||
{
|
{
|
||||||
struct scan_parameters params = {};
|
struct scan_parameters params = {};
|
||||||
|
struct scan_freq_set *freqs = scan_periodic_get_freqs(sc);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If this happens its due to the user disabling all bands. This will
|
||||||
|
* cause IWD to never issue another periodic scan so warn the user of
|
||||||
|
* this.
|
||||||
|
*/
|
||||||
|
if (L_WARN_ON(!freqs))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
params.freqs = freqs;
|
||||||
|
|
||||||
if (sc->sp.needs_active_scan && known_networks_has_hidden()) {
|
if (sc->sp.needs_active_scan && known_networks_has_hidden()) {
|
||||||
params.randomize_mac_addr_hint = true;
|
params.randomize_mac_addr_hint = true;
|
||||||
@ -1007,6 +1041,8 @@ static bool scan_periodic_queue(struct scan_context *sc)
|
|||||||
scan_periodic_notify, sc,
|
scan_periodic_notify, sc,
|
||||||
scan_periodic_destroy);
|
scan_periodic_destroy);
|
||||||
|
|
||||||
|
scan_freq_set_free(freqs);
|
||||||
|
|
||||||
return sc->sp.id != 0;
|
return sc->sp.id != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user