mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-11-20 04:19:25 +01:00
station: Don't expire BSSes between freq subset scans
Add a parameter to station_set_scan_results to allow skipping the removal of old BSSes. In the DBus-triggered scan only expire BSSes after having gone through the full supported frequency set. It should be safe to pass partial scan results to station_set_scan_results() when not expiring BSSes so using this new parameter I guess we could also call it for roam scan results.
This commit is contained in:
parent
e3bece76f9
commit
f5a30a1cfc
@ -610,7 +610,8 @@ static bool station_start_anqp(struct station *station, struct network *network,
|
|||||||
*/
|
*/
|
||||||
void station_set_scan_results(struct station *station,
|
void station_set_scan_results(struct station *station,
|
||||||
struct l_queue *new_bss_list,
|
struct l_queue *new_bss_list,
|
||||||
bool add_to_autoconnect)
|
bool add_to_autoconnect,
|
||||||
|
bool expire)
|
||||||
{
|
{
|
||||||
const struct l_queue_entry *bss_entry;
|
const struct l_queue_entry *bss_entry;
|
||||||
struct network *network;
|
struct network *network;
|
||||||
@ -624,6 +625,7 @@ void station_set_scan_results(struct station *station,
|
|||||||
l_queue_destroy(station->autoconnect_list, l_free);
|
l_queue_destroy(station->autoconnect_list, l_free);
|
||||||
station->autoconnect_list = l_queue_new();
|
station->autoconnect_list = l_queue_new();
|
||||||
|
|
||||||
|
if (expire)
|
||||||
station_bss_list_remove_expired_bsses(station);
|
station_bss_list_remove_expired_bsses(station);
|
||||||
|
|
||||||
for (bss_entry = l_queue_get_entries(station->bss_list); bss_entry;
|
for (bss_entry = l_queue_get_entries(station->bss_list); bss_entry;
|
||||||
@ -1022,7 +1024,7 @@ static bool new_scan_results(int err, struct l_queue *bss_list, void *userdata)
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
autoconnect = station_is_autoconnecting(station);
|
autoconnect = station_is_autoconnecting(station);
|
||||||
station_set_scan_results(station, bss_list, autoconnect);
|
station_set_scan_results(station, bss_list, autoconnect, true);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1088,7 +1090,7 @@ static bool station_quick_scan_results(int err, struct l_queue *bss_list,
|
|||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
autoconnect = station_is_autoconnecting(station);
|
autoconnect = station_is_autoconnecting(station);
|
||||||
station_set_scan_results(station, bss_list, autoconnect);
|
station_set_scan_results(station, bss_list, autoconnect, true);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
if (station->state == STATION_STATE_AUTOCONNECT_QUICK)
|
if (station->state == STATION_STATE_AUTOCONNECT_QUICK)
|
||||||
@ -2889,10 +2891,21 @@ static struct l_dbus_message *station_dbus_get_hidden_access_points(
|
|||||||
return reply;
|
return reply;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void station_dbus_scan_done(struct station *station)
|
static void station_dbus_scan_done(struct station *station, bool expired)
|
||||||
{
|
{
|
||||||
station->dbus_scan_id = 0;
|
station->dbus_scan_id = 0;
|
||||||
|
|
||||||
|
if (!expired) {
|
||||||
|
/*
|
||||||
|
* We haven't dropped old BSS records from bss_list during
|
||||||
|
* this scan yet so do it now. Call station_set_scan_results
|
||||||
|
* with an empty new BSS list to do this. Not the cheapest
|
||||||
|
* but this should only happen when station_dbus_scan_done is
|
||||||
|
* called early, i.e. due to an error.
|
||||||
|
*/
|
||||||
|
station_set_scan_results(station, l_queue_new(), false, true);
|
||||||
|
}
|
||||||
|
|
||||||
station_property_set_scanning(station, false);
|
station_property_set_scanning(station, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2910,7 +2923,7 @@ static void station_dbus_scan_triggered(int err, void *user_data)
|
|||||||
dbus_pending_reply(&station->scan_pending, reply);
|
dbus_pending_reply(&station->scan_pending, reply);
|
||||||
}
|
}
|
||||||
|
|
||||||
station_dbus_scan_done(station);
|
station_dbus_scan_done(station, false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2937,7 +2950,7 @@ static bool station_dbus_scan_results(int err, struct l_queue *bss_list, void *u
|
|||||||
bool last_subset;
|
bool last_subset;
|
||||||
|
|
||||||
if (err) {
|
if (err) {
|
||||||
station_dbus_scan_done(station);
|
station_dbus_scan_done(station, false);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2945,12 +2958,12 @@ static bool station_dbus_scan_results(int err, struct l_queue *bss_list, void *u
|
|||||||
last_subset = next_idx >= L_ARRAY_SIZE(station->scan_freqs_order) ||
|
last_subset = next_idx >= L_ARRAY_SIZE(station->scan_freqs_order) ||
|
||||||
station->scan_freqs_order[next_idx] == NULL;
|
station->scan_freqs_order[next_idx] == NULL;
|
||||||
|
|
||||||
station_set_scan_results(station, bss_list, autoconnect);
|
station_set_scan_results(station, bss_list, autoconnect, last_subset);
|
||||||
|
|
||||||
station->dbus_scan_subset_idx = next_idx;
|
station->dbus_scan_subset_idx = next_idx;
|
||||||
|
|
||||||
if (last_subset || !station_dbus_scan_subset(station))
|
if (last_subset || !station_dbus_scan_subset(station))
|
||||||
station_dbus_scan_done(station);
|
station_dbus_scan_done(station, last_subset);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -65,7 +65,7 @@ struct network *station_network_find(struct station *station, const char *ssid,
|
|||||||
enum security security);
|
enum security security);
|
||||||
|
|
||||||
void station_set_scan_results(struct station *station, struct l_queue *bss_list,
|
void station_set_scan_results(struct station *station, struct l_queue *bss_list,
|
||||||
bool add_to_autoconnect);
|
bool add_to_autoconnect, bool expire);
|
||||||
|
|
||||||
enum station_state station_get_state(struct station *station);
|
enum station_state station_get_state(struct station *station);
|
||||||
uint32_t station_add_state_watch(struct station *station,
|
uint32_t station_add_state_watch(struct station *station,
|
||||||
|
@ -787,7 +787,7 @@ static bool push_button_scan_results(int err, struct l_queue *bss_list,
|
|||||||
}
|
}
|
||||||
|
|
||||||
wsc_cancel_scan(wsc);
|
wsc_cancel_scan(wsc);
|
||||||
station_set_scan_results(wsc->station, bss_list, false);
|
station_set_scan_results(wsc->station, bss_list, false, true);
|
||||||
|
|
||||||
l_debug("Found AP to connect to: %s",
|
l_debug("Found AP to connect to: %s",
|
||||||
util_address_to_string(target->addr));
|
util_address_to_string(target->addr));
|
||||||
@ -931,7 +931,7 @@ static bool pin_scan_results(int err, struct l_queue *bss_list, void *userdata)
|
|||||||
}
|
}
|
||||||
|
|
||||||
wsc_cancel_scan(wsc);
|
wsc_cancel_scan(wsc);
|
||||||
station_set_scan_results(wsc->station, bss_list, false);
|
station_set_scan_results(wsc->station, bss_list, false, true);
|
||||||
|
|
||||||
l_debug("Found AP to connect to: %s",
|
l_debug("Found AP to connect to: %s",
|
||||||
util_address_to_string(target->addr));
|
util_address_to_string(target->addr));
|
||||||
|
Loading…
Reference in New Issue
Block a user