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];
|
const u8 *wep_key[4];
|
||||||
size_t wep_key_len[4];
|
size_t wep_key_len[4];
|
||||||
int wep_tx_keyidx;
|
int wep_tx_keyidx;
|
||||||
|
int local_state_change;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -54,6 +54,7 @@ struct wpa_sm_ctx {
|
||||||
size_t ies_len);
|
size_t ies_len);
|
||||||
int (*send_ft_action)(void *ctx, u8 action, const u8 *target_ap,
|
int (*send_ft_action)(void *ctx, u8 action, const u8 *target_ap,
|
||||||
const u8 *ies, size_t ies_len);
|
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);
|
os_free(ft_ies);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wpa_sm_mark_authenticated(sm, bssid);
|
||||||
ret = wpa_ft_install_ptk(sm, bssid);
|
ret = wpa_ft_install_ptk(sm, bssid);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -225,6 +225,14 @@ static inline int wpa_sm_send_ft_action(struct wpa_sm *sm, u8 action,
|
||||||
return -1;
|
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,
|
void wpa_eapol_key_send(struct wpa_sm *sm, const u8 *kck,
|
||||||
int ver, const u8 *dest, u16 proto,
|
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);
|
ies, ies_len);
|
||||||
return wpa_drv_send_ft_action(wpa_s, action, target_ap, 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_IEEE80211R */
|
||||||
|
|
||||||
#endif /* CONFIG_NO_WPA */
|
#endif /* CONFIG_NO_WPA */
|
||||||
|
@ -617,6 +641,7 @@ int wpa_supplicant_init_wpa(struct wpa_supplicant *wpa_s)
|
||||||
#ifdef CONFIG_IEEE80211R
|
#ifdef CONFIG_IEEE80211R
|
||||||
ctx->update_ft_ies = wpa_supplicant_update_ft_ies;
|
ctx->update_ft_ies = wpa_supplicant_update_ft_ies;
|
||||||
ctx->send_ft_action = wpa_supplicant_send_ft_action;
|
ctx->send_ft_action = wpa_supplicant_send_ft_action;
|
||||||
|
ctx->mark_authenticated = wpa_supplicant_mark_authenticated;
|
||||||
#endif /* CONFIG_IEEE80211R */
|
#endif /* CONFIG_IEEE80211R */
|
||||||
|
|
||||||
wpa_s->wpa = wpa_sm_init(ctx);
|
wpa_s->wpa = wpa_sm_init(ctx);
|
||||||
|
|
Loading…
Reference in a new issue