diff --git a/wpa_supplicant/mesh_rsn.c b/wpa_supplicant/mesh_rsn.c index d5cf7a916..936002d95 100644 --- a/wpa_supplicant/mesh_rsn.c +++ b/wpa_supplicant/mesh_rsn.c @@ -27,6 +27,7 @@ #define MESH_AUTH_TIMEOUT 10 #define MESH_AUTH_RETRY 3 +#define MESH_AUTH_BLOCK_DURATION 3600 void mesh_auth_timer(void *eloop_ctx, void *user_data) { @@ -42,12 +43,23 @@ void mesh_auth_timer(void *eloop_ctx, void *user_data) if (sta->sae_auth_retry < MESH_AUTH_RETRY) { mesh_rsn_auth_sae_sta(wpa_s, sta); } else { + if (sta->sae_auth_retry > MESH_AUTH_RETRY) { + ap_free_sta(wpa_s->ifmsh->bss[0], sta); + return; + } + /* block the STA if exceeded the number of attempts */ wpa_mesh_set_plink_state(wpa_s, sta, PLINK_BLOCKED); sta->sae->state = SAE_NOTHING; + if (wpa_s->mesh_auth_block_duration < + MESH_AUTH_BLOCK_DURATION) + wpa_s->mesh_auth_block_duration += 60; + eloop_register_timeout(wpa_s->mesh_auth_block_duration, + 0, mesh_auth_timer, wpa_s, sta); wpa_msg(wpa_s, MSG_INFO, MESH_SAE_AUTH_BLOCKED "addr=" - MACSTR, - MAC2STR(sta->addr)); + MACSTR " duration=%d", + MAC2STR(sta->addr), + wpa_s->mesh_auth_block_duration); } sta->sae_auth_retry++; } @@ -304,6 +316,7 @@ int mesh_rsn_auth_sae_sta(struct wpa_supplicant *wpa_s, if (ret) return ret; + eloop_cancel_timeout(mesh_auth_timer, wpa_s, sta); rnd = rand() % MESH_AUTH_TIMEOUT; eloop_register_timeout(MESH_AUTH_TIMEOUT + rnd, 0, mesh_auth_timer, wpa_s, sta); diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h index c80a6209c..05c3d9238 100644 --- a/wpa_supplicant/wpa_supplicant_i.h +++ b/wpa_supplicant/wpa_supplicant_i.h @@ -712,6 +712,7 @@ struct wpa_supplicant { int mesh_if_idx; unsigned int mesh_if_created:1; unsigned int mesh_ht_enabled:1; + int mesh_auth_block_duration; /* sec */ #endif /* CONFIG_MESH */ unsigned int off_channel_freq;