3
0
mirror of https://git.kernel.org/pub/scm/network/wireless/iwd.git synced 2024-11-21 22:09:23 +01:00

ft: add ft_handshake_setup

This will be called from station after FT-authentication has
finished. It sets up the handshake object to perform reassociation.

This is essentially a copy-paste of ft_associate without sending
the actual frame.
This commit is contained in:
James Prestwood 2023-12-06 12:17:58 -08:00 committed by Denis Kenzior
parent cf137f4199
commit 4efd1a1702
2 changed files with 42 additions and 0 deletions

View File

@ -1276,6 +1276,46 @@ int ft_associate(uint32_t ifindex, const uint8_t *addr)
return ret;
}
int ft_handshake_setup(uint32_t ifindex, const uint8_t *target)
{
struct netdev *netdev = netdev_find(ifindex);
struct handshake_state *hs = netdev_get_handshake(netdev);
struct ft_info *info;
int ret = 0;
info = ft_info_find(ifindex, target);
if (!info)
return -ENOENT;
/*
* Either failed or no response. This may have been an FT-over-DS
* attempt so clear out the entry so FT-over-Air can try again.
*/
if (info->status != 0) {
int status = info->status;
l_queue_remove(info_list, info);
ft_info_destroy(info);
return status;
}
/*
* This shouldn't ever fail:
* - supplicant_ie has already been validated long ago
* - l_checksum_* shouldn't fail since we presumable have kernel
* support, how else could we have made it this far.
* But just in case...
*/
if (L_WARN_ON(!ft_prepare_handshake(info, hs)))
ret = -EINVAL;
/* After this no previous auths will be valid */
ft_clear_authentications(ifindex);
return ret;
}
static bool remove_ifindex(void *data, void *user_data)
{
struct ft_info *info = data;

View File

@ -39,6 +39,8 @@ void __ft_rx_action(uint32_t ifindex, const uint8_t *frame, size_t frame_len);
void __ft_rx_authenticate(uint32_t ifindex, const uint8_t *frame,
size_t frame_len);
int ft_handshake_setup(uint32_t ifindex, const uint8_t *target);
void ft_clear_authentications(uint32_t ifindex);
int ft_action(uint32_t ifindex, uint32_t freq, const struct scan_bss *target);
int ft_associate(uint32_t ifindex, const uint8_t *addr);