mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2025-02-16 15:20:42 +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;
|
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)
|
static bool remove_ifindex(void *data, void *user_data)
|
||||||
{
|
{
|
||||||
struct ft_info *info = 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,
|
void __ft_rx_authenticate(uint32_t ifindex, const uint8_t *frame,
|
||||||
size_t frame_len);
|
size_t frame_len);
|
||||||
|
|
||||||
|
int ft_handshake_setup(uint32_t ifindex, const uint8_t *target);
|
||||||
|
|
||||||
void ft_clear_authentications(uint32_t ifindex);
|
void ft_clear_authentications(uint32_t ifindex);
|
||||||
int ft_action(uint32_t ifindex, uint32_t freq, const struct scan_bss *target);
|
int ft_action(uint32_t ifindex, uint32_t freq, const struct scan_bss *target);
|
||||||
int ft_associate(uint32_t ifindex, const uint8_t *addr);
|
int ft_associate(uint32_t ifindex, const uint8_t *addr);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user