Apply 3e2ad1b932d827ddb038a5f9163bca766803811a from the wpa git tree:
* fixed race condition between disassociation event and group key handshake to avoid getting stuck in incorrect state [Bug 261]
This commit is contained in:
parent
c5ddeafa76
commit
503c450ac3
3
dist/wpa/src/rsn_supp/wpa.c
vendored
3
dist/wpa/src/rsn_supp/wpa.c
vendored
@ -454,7 +454,6 @@ static void wpa_supplicant_key_neg_complete(struct wpa_sm *sm,
|
||||
MACSTR " [PTK=%s GTK=%s]", MAC2STR(addr),
|
||||
wpa_cipher_txt(sm->pairwise_cipher),
|
||||
wpa_cipher_txt(sm->group_cipher));
|
||||
wpa_sm_cancel_scan(sm);
|
||||
wpa_sm_cancel_auth_timeout(sm);
|
||||
wpa_sm_set_state(sm, WPA_COMPLETED);
|
||||
|
||||
@ -786,7 +785,6 @@ static void wpa_report_ie_mismatch(struct wpa_sm *sm,
|
||||
}
|
||||
|
||||
wpa_sm_disassociate(sm, WLAN_REASON_IE_IN_4WAY_DIFFERS);
|
||||
wpa_sm_req_scan(sm, 0, 0);
|
||||
}
|
||||
|
||||
|
||||
@ -1796,7 +1794,6 @@ static void wpa_sm_pmksa_free_cb(struct rsn_pmksa_cache_entry *entry,
|
||||
|
||||
os_memset(sm->pmk, 0, sizeof(sm->pmk));
|
||||
wpa_sm_deauthenticate(sm, WLAN_REASON_UNSPECIFIED);
|
||||
wpa_sm_req_scan(sm, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
2
dist/wpa/src/rsn_supp/wpa.h
vendored
2
dist/wpa/src/rsn_supp/wpa.h
vendored
@ -37,8 +37,6 @@ struct wpa_sm_ctx {
|
||||
|
||||
void (*set_state)(void *ctx, wpa_states state);
|
||||
wpa_states (*get_state)(void *ctx);
|
||||
void (*req_scan)(void *ctx, int sec, int usec);
|
||||
void (*cancel_scan)(void *ctx);
|
||||
void (*deauthenticate)(void * ctx, int reason_code);
|
||||
void (*disassociate)(void *ctx, int reason_code);
|
||||
int (*set_key)(void *ctx, wpa_alg alg,
|
||||
|
12
dist/wpa/src/rsn_supp/wpa_i.h
vendored
12
dist/wpa/src/rsn_supp/wpa_i.h
vendored
@ -113,18 +113,6 @@ static inline wpa_states wpa_sm_get_state(struct wpa_sm *sm)
|
||||
return sm->ctx->get_state(sm->ctx->ctx);
|
||||
}
|
||||
|
||||
static inline void wpa_sm_req_scan(struct wpa_sm *sm, int sec, int usec)
|
||||
{
|
||||
WPA_ASSERT(sm->ctx->req_scan);
|
||||
sm->ctx->req_scan(sm->ctx->ctx, sec, usec);
|
||||
}
|
||||
|
||||
static inline void wpa_sm_cancel_scan(struct wpa_sm *sm)
|
||||
{
|
||||
WPA_ASSERT(sm->ctx->cancel_scan);
|
||||
sm->ctx->cancel_scan(sm->ctx->ctx);
|
||||
}
|
||||
|
||||
static inline void wpa_sm_deauthenticate(struct wpa_sm *sm, int reason_code)
|
||||
{
|
||||
WPA_ASSERT(sm->ctx->deauthenticate);
|
||||
|
14
dist/wpa/wpa_supplicant/preauth_test.c
vendored
14
dist/wpa/wpa_supplicant/preauth_test.c
vendored
@ -43,18 +43,6 @@ struct preauth_test_data {
|
||||
};
|
||||
|
||||
|
||||
static void _wpa_supplicant_req_scan(void *wpa_s, int sec, int usec)
|
||||
{
|
||||
wpa_supplicant_req_scan(wpa_s, sec, usec);
|
||||
}
|
||||
|
||||
|
||||
static void _wpa_supplicant_cancel_scan(void *wpa_s)
|
||||
{
|
||||
wpa_supplicant_cancel_scan(wpa_s);
|
||||
}
|
||||
|
||||
|
||||
static void _wpa_supplicant_disassociate(void *wpa_s, int reason_code)
|
||||
{
|
||||
wpa_supplicant_disassociate(wpa_s, reason_code);
|
||||
@ -253,8 +241,6 @@ static void wpa_init_conf(struct wpa_supplicant *wpa_s, const char *ifname)
|
||||
ctx->ctx = wpa_s;
|
||||
ctx->set_state = _wpa_supplicant_set_state;
|
||||
ctx->get_state = _wpa_supplicant_get_state;
|
||||
ctx->req_scan = _wpa_supplicant_req_scan;
|
||||
ctx->cancel_scan = _wpa_supplicant_cancel_scan;
|
||||
ctx->deauthenticate = _wpa_supplicant_deauthenticate;
|
||||
ctx->disassociate = _wpa_supplicant_disassociate;
|
||||
ctx->set_key = wpa_supplicant_set_key;
|
||||
|
19
dist/wpa/wpa_supplicant/wpas_glue.c
vendored
19
dist/wpa/wpa_supplicant/wpas_glue.c
vendored
@ -270,7 +270,6 @@ static void wpa_supplicant_notify_eapol_done(void *ctx)
|
||||
wpa_s->key_mgmt == WPA_KEY_MGMT_FT_IEEE8021X) {
|
||||
wpa_supplicant_set_state(wpa_s, WPA_4WAY_HANDSHAKE);
|
||||
} else {
|
||||
wpa_supplicant_cancel_scan(wpa_s);
|
||||
wpa_supplicant_cancel_auth_timeout(wpa_s);
|
||||
wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
|
||||
}
|
||||
@ -354,18 +353,6 @@ static int _wpa_ether_send(void *wpa_s, const u8 *dest, u16 proto,
|
||||
}
|
||||
|
||||
|
||||
static void _wpa_supplicant_req_scan(void *wpa_s, int sec, int usec)
|
||||
{
|
||||
wpa_supplicant_req_scan(wpa_s, sec, usec);
|
||||
}
|
||||
|
||||
|
||||
static void _wpa_supplicant_cancel_scan(void *wpa_s)
|
||||
{
|
||||
wpa_supplicant_cancel_scan(wpa_s);
|
||||
}
|
||||
|
||||
|
||||
static void _wpa_supplicant_cancel_auth_timeout(void *wpa_s)
|
||||
{
|
||||
wpa_supplicant_cancel_auth_timeout(wpa_s);
|
||||
@ -398,12 +385,16 @@ static wpa_states _wpa_supplicant_get_state(void *wpa_s)
|
||||
static void _wpa_supplicant_disassociate(void *wpa_s, int reason_code)
|
||||
{
|
||||
wpa_supplicant_disassociate(wpa_s, reason_code);
|
||||
/* Schedule a scan to make sure we continue looking for networks */
|
||||
wpa_supplicant_req_scan(wpa_s, 0, 0);
|
||||
}
|
||||
|
||||
|
||||
static void _wpa_supplicant_deauthenticate(void *wpa_s, int reason_code)
|
||||
{
|
||||
wpa_supplicant_deauthenticate(wpa_s, reason_code);
|
||||
/* Schedule a scan to make sure we continue looking for networks */
|
||||
wpa_supplicant_req_scan(wpa_s, 0, 0);
|
||||
}
|
||||
|
||||
|
||||
@ -536,8 +527,6 @@ int wpa_supplicant_init_wpa(struct wpa_supplicant *wpa_s)
|
||||
ctx->ctx = wpa_s;
|
||||
ctx->set_state = _wpa_supplicant_set_state;
|
||||
ctx->get_state = _wpa_supplicant_get_state;
|
||||
ctx->req_scan = _wpa_supplicant_req_scan;
|
||||
ctx->cancel_scan = _wpa_supplicant_cancel_scan;
|
||||
ctx->deauthenticate = _wpa_supplicant_deauthenticate;
|
||||
ctx->disassociate = _wpa_supplicant_disassociate;
|
||||
ctx->set_key = wpa_supplicant_set_key;
|
||||
|
Loading…
Reference in New Issue
Block a user