mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-12-22 04:32:37 +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:
parent
cf137f4199
commit
4efd1a1702
40
src/ft.c
40
src/ft.c
@ -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;
|
||||
|
2
src/ft.h
2
src/ft.h
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user