FT: Add driver op for marking a STA authenticated
This can be used with FT-over-DS where FT Action frame exchange triggers transition to State 2 (authenticated) without Authentication frame exchange.
This commit is contained in:
parent
fe1919856c
commit
2a7e7f4e4a
5 changed files with 36 additions and 0 deletions
|
@ -278,6 +278,7 @@ struct wpa_driver_auth_params {
|
|||
const u8 *wep_key[4];
|
||||
size_t wep_key_len[4];
|
||||
int wep_tx_keyidx;
|
||||
int local_state_change;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -54,6 +54,7 @@ struct wpa_sm_ctx {
|
|||
size_t ies_len);
|
||||
int (*send_ft_action)(void *ctx, u8 action, const u8 *target_ap,
|
||||
const u8 *ies, size_t ies_len);
|
||||
int (*mark_authenticated)(void *ctx, const u8 *target_ap);
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -628,6 +628,7 @@ int wpa_ft_process_response(struct wpa_sm *sm, const u8 *ies, size_t ies_len,
|
|||
os_free(ft_ies);
|
||||
}
|
||||
|
||||
wpa_sm_mark_authenticated(sm, bssid);
|
||||
ret = wpa_ft_install_ptk(sm, bssid);
|
||||
if (ret) {
|
||||
/*
|
||||
|
|
|
@ -225,6 +225,14 @@ static inline int wpa_sm_send_ft_action(struct wpa_sm *sm, u8 action,
|
|||
return -1;
|
||||
}
|
||||
|
||||
static inline int wpa_sm_mark_authenticated(struct wpa_sm *sm,
|
||||
const u8 *target_ap)
|
||||
{
|
||||
if (sm->ctx->mark_authenticated)
|
||||
return sm->ctx->mark_authenticated(sm->ctx->ctx, target_ap);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
void wpa_eapol_key_send(struct wpa_sm *sm, const u8 *kck,
|
||||
int ver, const u8 *dest, u16 proto,
|
||||
|
|
|
@ -489,6 +489,30 @@ static int wpa_supplicant_send_ft_action(void *ctx, u8 action,
|
|||
ies, ies_len);
|
||||
return wpa_drv_send_ft_action(wpa_s, action, target_ap, ies, ies_len);
|
||||
}
|
||||
|
||||
|
||||
static int wpa_supplicant_mark_authenticated(void *ctx, const u8 *target_ap)
|
||||
{
|
||||
struct wpa_supplicant *wpa_s = ctx;
|
||||
struct wpa_driver_auth_params params;
|
||||
struct wpa_bss *bss;
|
||||
|
||||
if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME)
|
||||
return -1;
|
||||
|
||||
bss = wpa_bss_get_bssid(wpa_s, target_ap);
|
||||
if (bss == NULL)
|
||||
return -1;
|
||||
|
||||
os_memset(¶ms, 0, sizeof(params));
|
||||
params.bssid = target_ap;
|
||||
params.freq = bss->freq;
|
||||
params.ssid = bss->ssid;
|
||||
params.ssid_len = bss->ssid_len;
|
||||
params.auth_alg = WPA_AUTH_ALG_FT;
|
||||
params.local_state_change = 1;
|
||||
return wpa_drv_authenticate(wpa_s, ¶ms);
|
||||
}
|
||||
#endif /* CONFIG_IEEE80211R */
|
||||
|
||||
#endif /* CONFIG_NO_WPA */
|
||||
|
@ -617,6 +641,7 @@ int wpa_supplicant_init_wpa(struct wpa_supplicant *wpa_s)
|
|||
#ifdef CONFIG_IEEE80211R
|
||||
ctx->update_ft_ies = wpa_supplicant_update_ft_ies;
|
||||
ctx->send_ft_action = wpa_supplicant_send_ft_action;
|
||||
ctx->mark_authenticated = wpa_supplicant_mark_authenticated;
|
||||
#endif /* CONFIG_IEEE80211R */
|
||||
|
||||
wpa_s->wpa = wpa_sm_init(ctx);
|
||||
|
|
Loading…
Reference in a new issue