@@ -122,6 +122,7 @@ struct station {
uint32_t wiphy_watch;
+ struct l_idle *ft_idle;
struct wiphy_radio_work_item ft_work;
bool preparing_roam : 1;
@@ -1739,6 +1740,11 @@ static void station_roam_state_clear(struct station *station)
station->roam_freqs = NULL;
}
+ if (station->ft_idle) {
+ l_idle_remove(station->ft_idle);
+ station->ft_idle = NULL;
+ }
+
l_queue_clear(station->roam_bss_list, l_free);
ft_clear_authentications(netdev_get_ifindex(station->netdev));
@@ -2282,6 +2288,16 @@ static void station_preauthenticate_cb(struct netdev *netdev,
static void station_transition_start(struct station *station);
+static void station_transition_idle(struct l_idle *idle, void *user_data)
+{
+ struct station *station = user_data;
+
+ l_idle_remove(station->ft_idle);
+ station->ft_idle = NULL;
+
+ station_transition_start(station);
+}
+
static bool station_ft_work_ready(struct wiphy_radio_work_item *item)
{
struct station *station = l_container_of(item, struct station, ft_work);
@@ -2300,7 +2316,8 @@ static bool station_ft_work_ready(struct wiphy_radio_work_item *item)
if (ret == -ENOENT) {
station_debug_event(station, "ft-roam-failed");
try_next:
- station_transition_start(station);
+ station->ft_idle = l_idle_create(station_transition_idle,
+ station, NULL);
return true;
} else if (ret < 0)
goto assoc_failed;