From 56dac6744b359d1b090b366a8f40ed20c1f188a6 Mon Sep 17 00:00:00 2001 From: James Prestwood Date: Wed, 6 Dec 2023 12:18:00 -0800 Subject: [PATCH] station: use netdev_ft_reassociate Using this will provide netdev with a connect callback and unify the roaming result notification between FT and reassociation. Both paths will now end up in station_reassociate_cb. This also adds another return case for ft_handshake_setup which was previously ignored by ft_associate. Its likely impossible to actually happen but should be handled nevertheless. Fixes: 30c6a10f28 ("netdev: Separate connect_failed and disconnected paths") --- src/station.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/station.c b/src/station.c index 48a595dc..52d87c84 100644 --- a/src/station.c +++ b/src/station.c @@ -2181,7 +2181,8 @@ static void station_reassociate_cb(struct netdev *netdev, l_debug("%u, result: %d", netdev_get_ifindex(station->netdev), result); - if (station->state != STATION_STATE_ROAMING) + if (station->state != STATION_STATE_ROAMING && + station->state != STATION_STATE_FT_ROAMING) return; if (result == NETDEV_RESULT_OK) @@ -2314,7 +2315,8 @@ static bool station_ft_work_ready(struct wiphy_radio_work_item *item) if (!bss) goto try_next; - ret = ft_associate(netdev_get_ifindex(station->netdev), bss->addr); + ret = ft_handshake_setup(netdev_get_ifindex(station->netdev), + bss->addr); switch (ret) { case MMPDU_STATUS_CODE_INVALID_PMKID: /* @@ -2343,12 +2345,28 @@ try_next: station_transition_start(station); break; case 0: + ret = netdev_ft_reassociate(station->netdev, bss, + station->connected_bss, + station_netdev_event, + station_reassociate_cb, station); + if (ret < 0) + goto disassociate; + station->connected_bss = bss; station->preparing_roam = false; station_enter_state(station, STATION_STATE_FT_ROAMING); station_debug_event(station, "ft-roam"); + break; + case -EINVAL: + /* + * Likely an impossible situation, but since ft_handshake_setup + * rederived the handshake keys we can't do anything but + * disconnect. + */ +disassociate: + station_disassociated(station); break; default: if (ret > 0)