mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-11-29 13:59:24 +01:00
station: Use active scan in autoconnect mode
When we're auto-connecting and have hidden networks configured, use active scans regardless of whether we see any hidden BSSes in our existing scan results. This allows us to more effectively see/connect to hidden networks when first powering up or after suspend.
This commit is contained in:
parent
73309686bd
commit
6ced1ec9de
@ -1076,8 +1076,13 @@ static void periodic_scan_stop(struct station *station)
|
|||||||
|
|
||||||
static bool station_needs_hidden_network_scan(struct station *station)
|
static bool station_needs_hidden_network_scan(struct station *station)
|
||||||
{
|
{
|
||||||
return !l_queue_isempty(station->hidden_bss_list_sorted) &&
|
if (!known_networks_has_hidden())
|
||||||
known_networks_has_hidden();
|
return false;
|
||||||
|
|
||||||
|
if (station_is_autoconnecting(station))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return !l_queue_isempty(station->hidden_bss_list_sorted);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t station_scan_trigger(struct station *station,
|
static uint32_t station_scan_trigger(struct station *station,
|
||||||
@ -1094,8 +1099,8 @@ static uint32_t station_scan_trigger(struct station *station,
|
|||||||
params.freqs = freqs;
|
params.freqs = freqs;
|
||||||
|
|
||||||
if (wiphy_can_randomize_mac_addr(station->wiphy) ||
|
if (wiphy_can_randomize_mac_addr(station->wiphy) ||
|
||||||
station_needs_hidden_network_scan(station) ||
|
station->connected_bss ||
|
||||||
station->connected_bss) {
|
station_needs_hidden_network_scan(station)) {
|
||||||
/* If we're connected, HW cannot randomize our MAC */
|
/* If we're connected, HW cannot randomize our MAC */
|
||||||
if (!station->connected_bss)
|
if (!station->connected_bss)
|
||||||
params.randomize_mac_addr_hint = true;
|
params.randomize_mac_addr_hint = true;
|
||||||
@ -1159,30 +1164,30 @@ static void station_quick_scan_destroy(void *userdata)
|
|||||||
station->quick_scan_id = 0;
|
station->quick_scan_id = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void station_quick_scan_trigger(struct station *station)
|
static int station_quick_scan_trigger(struct station *station)
|
||||||
{
|
{
|
||||||
struct scan_freq_set *known_freq_set;
|
struct scan_freq_set *known_freq_set;
|
||||||
|
|
||||||
known_freq_set = known_networks_get_recent_frequencies(5);
|
known_freq_set = known_networks_get_recent_frequencies(5);
|
||||||
if (!known_freq_set)
|
if (!known_freq_set)
|
||||||
goto autoconnect_full;
|
return -ENODATA;
|
||||||
|
|
||||||
if (!wiphy_constrain_freq_set(station->wiphy, known_freq_set))
|
if (!wiphy_constrain_freq_set(station->wiphy, known_freq_set)) {
|
||||||
goto skip_scan;
|
scan_freq_set_free(known_freq_set);
|
||||||
|
return -ENOTSUP;
|
||||||
|
}
|
||||||
|
|
||||||
station->quick_scan_id = station_scan_trigger(station,
|
station->quick_scan_id = station_scan_trigger(station,
|
||||||
known_freq_set,
|
known_freq_set,
|
||||||
station_quick_scan_triggered,
|
station_quick_scan_triggered,
|
||||||
station_quick_scan_results,
|
station_quick_scan_results,
|
||||||
station_quick_scan_destroy);
|
station_quick_scan_destroy);
|
||||||
skip_scan:
|
|
||||||
scan_freq_set_free(known_freq_set);
|
scan_freq_set_free(known_freq_set);
|
||||||
|
|
||||||
if (station->quick_scan_id)
|
if (!station->quick_scan_id)
|
||||||
return;
|
return -EIO;
|
||||||
|
|
||||||
autoconnect_full:
|
return 0;
|
||||||
station_enter_state(station, STATION_STATE_AUTOCONNECT_FULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *station_state_to_string(enum station_state state)
|
static const char *station_state_to_string(enum station_state state)
|
||||||
@ -1225,10 +1230,15 @@ static void station_enter_state(struct station *station,
|
|||||||
l_dbus_property_changed(dbus, netdev_get_path(station->netdev),
|
l_dbus_property_changed(dbus, netdev_get_path(station->netdev),
|
||||||
IWD_STATION_INTERFACE, "State");
|
IWD_STATION_INTERFACE, "State");
|
||||||
|
|
||||||
|
station->state = state;
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case STATION_STATE_AUTOCONNECT_QUICK:
|
case STATION_STATE_AUTOCONNECT_QUICK:
|
||||||
station_quick_scan_trigger(station);
|
if (!station_quick_scan_trigger(station))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
station->state = STATION_STATE_AUTOCONNECT_FULL;
|
||||||
|
/* Fall through */
|
||||||
case STATION_STATE_AUTOCONNECT_FULL:
|
case STATION_STATE_AUTOCONNECT_FULL:
|
||||||
scan_periodic_start(id, periodic_scan_trigger,
|
scan_periodic_start(id, periodic_scan_trigger,
|
||||||
new_scan_results, station);
|
new_scan_results, station);
|
||||||
@ -1256,10 +1266,8 @@ static void station_enter_state(struct station *station,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
station->state = state;
|
|
||||||
|
|
||||||
WATCHLIST_NOTIFY(&station->state_watches,
|
WATCHLIST_NOTIFY(&station->state_watches,
|
||||||
station_state_watch_func_t, state);
|
station_state_watch_func_t, station->state);
|
||||||
}
|
}
|
||||||
|
|
||||||
enum station_state station_get_state(struct station *station)
|
enum station_state station_get_state(struct station *station)
|
||||||
|
Loading…
Reference in New Issue
Block a user