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:
Denis Kenzior 2021-02-03 09:14:41 -06:00
parent 73309686bd
commit 6ced1ec9de
1 changed files with 26 additions and 18 deletions

View File

@ -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)