3
0
mirror of https://git.kernel.org/pub/scm/network/wireless/iwd.git synced 2024-11-24 16:49:25 +01:00

station: knownnetworks: limit quick scans to 5 freqs per network

In very large network deployments there could be a vast amount of APs
which could create a large known frequency list after some time once
all the APs are seen in scan results. This then increases the quick
scan time significantly, in the very worst case (but unlikely) just
as long as a full scan.

To help with this support in knownnetworks was added to limit the
number of frequencies per network. Station will now only get 5
recent frequencies per network making the maximum frequencies 25
in the worst case (~2.5s scan).

The magic values are now defines, and the recent roam frequencies
was also changed to use this define as well.
This commit is contained in:
James Prestwood 2024-01-26 12:22:42 -08:00 committed by Denis Kenzior
parent 197087d081
commit f52180d41c
3 changed files with 31 additions and 15 deletions

View File

@ -517,8 +517,23 @@ struct network_info *known_networks_find(const char *ssid,
return l_queue_find(known_networks, network_info_match, &query);
}
static void known_network_append_frequencies(const struct network_info *info,
struct scan_freq_set *set,
uint8_t max)
{
const struct l_queue_entry *entry;
for (entry = l_queue_get_entries(info->known_frequencies); entry && max;
entry = entry->next, max--) {
const struct known_frequency *known_freq = entry->data;
scan_freq_set_add(set, known_freq->frequency);
}
}
struct scan_freq_set *known_networks_get_recent_frequencies(
uint8_t num_networks_tosearch)
uint8_t num_networks_tosearch,
uint8_t freqs_per_network)
{
/*
* This search function assumes that the known networks are always
@ -527,10 +542,9 @@ struct scan_freq_set *known_networks_get_recent_frequencies(
* list.
*/
const struct l_queue_entry *network_entry;
const struct l_queue_entry *freq_entry;
struct scan_freq_set *set;
if (!num_networks_tosearch)
if (!num_networks_tosearch || !freqs_per_network)
return NULL;
set = scan_freq_set_new();
@ -541,14 +555,8 @@ struct scan_freq_set *known_networks_get_recent_frequencies(
num_networks_tosearch--) {
const struct network_info *network = network_entry->data;
for (freq_entry = l_queue_get_entries(
network->known_frequencies);
freq_entry; freq_entry = freq_entry->next) {
const struct known_frequency *known_freq =
freq_entry->data;
scan_freq_set_add(set, known_freq->frequency);
}
known_network_append_frequencies(network, set,
freqs_per_network);
}
return set;

View File

@ -113,8 +113,10 @@ struct network_info *known_networks_find(const char *ssid,
enum security security);
struct scan_freq_set *known_networks_get_recent_frequencies(
uint8_t num_networks_tosearch);
int known_network_add_frequency(struct network_info *info, uint32_t frequency);
uint8_t num_networks_tosearch,
uint8_t freqs_per_network);
int known_network_add_frequency(struct network_info *info,
uint32_t frequency);
void known_network_frequency_sync(struct network_info *info);
uint32_t known_networks_watch_add(known_networks_watch_func_t func,

View File

@ -64,6 +64,9 @@
#include "src/eap-tls-common.h"
#include "src/storage.h"
#define STATION_RECENT_NETWORK_LIMIT 5
#define STATION_RECENT_FREQS_LIMIT 5
static struct l_queue *station_list;
static uint32_t netdev_watch;
static uint32_t mfp_setting;
@ -1438,7 +1441,9 @@ static int station_quick_scan_trigger(struct station *station)
return -EAGAIN;
}
known_freq_set = known_networks_get_recent_frequencies(5);
known_freq_set = known_networks_get_recent_frequencies(
STATION_RECENT_NETWORK_LIMIT,
STATION_RECENT_FREQS_LIMIT);
if (!known_freq_set)
return -ENODATA;
@ -2761,7 +2766,8 @@ static int station_roam_scan_known_freqs(struct station *station)
const struct network_info *info = network_get_info(
station->connected_network);
struct scan_freq_set *freqs = network_info_get_roam_frequencies(info,
station->connected_bss->frequency, 5);
station->connected_bss->frequency,
STATION_RECENT_FREQS_LIMIT);
int r = -ENODATA;
if (!freqs)