diff --git a/src/ft.c b/src/ft.c index db09aacf..fecb4c0e 100644 --- a/src/ft.c +++ b/src/ft.c @@ -616,6 +616,9 @@ void ft_ds_info_free(struct ft_ds_info *info) if (info->fte) l_free(info->fte); + if (info->authenticator_ie) + l_free(info->authenticator_ie); + if (destroy) destroy(info); } diff --git a/src/ft.h b/src/ft.h index a2fa8946..f90fc1b2 100644 --- a/src/ft.h +++ b/src/ft.h @@ -36,6 +36,7 @@ struct ft_ds_info { uint8_t snonce[32]; uint8_t mde[3]; uint8_t *fte; + uint8_t *authenticator_ie; struct ie_ft_info ft_info; diff --git a/src/netdev.c b/src/netdev.c index bedc8377..de6af614 100644 --- a/src/netdev.c +++ b/src/netdev.c @@ -4392,6 +4392,11 @@ int netdev_fast_transition_over_ds_action(struct netdev *netdev, memcpy(info->super.spa, hs->spa, ETH_ALEN); memcpy(info->super.aa, target_bss->addr, ETH_ALEN); memcpy(info->super.mde, target_bss->mde, sizeof(info->super.mde)); + + if (target_bss->rsne) + info->super.authenticator_ie = l_memdup(target_bss->rsne, + target_bss->rsne[1] + 2); + l_getrandom(info->super.snonce, 32); info->super.free = netdev_ft_ds_info_free; @@ -4403,7 +4408,6 @@ int netdev_fast_transition_over_ds_action(struct netdev *netdev, iovs[0].iov_base = ft_req; iovs[0].iov_len = sizeof(ft_req); - if (!ft_build_authenticate_ies(hs, false, info->super.snonce, buf, &len)) goto failed;