mirror of
https://github.com/vanhoefm/fragattacks.git
synced 2024-11-29 02:38:22 -05:00
hostapd: Ignore LOW_ACK event for co-operative steering clients
Ignore hostapd_event_sta_low_ack for a station which has agreed to steering by checking the agreed_to_steer flag. This flag will be set whenever a station accepts the BSS transition request from the AP. Without this ignoring of the LOW_ACK event, the steering in-progress might be affected due to disassociation. In this way AP will allow some time (two seconds) for the station to move away and reset the flag after the timeout. Co-Developed-by: Tamizh Chelvam <tamizhr@codeaurora.org> Signed-off-by: Rajkumar Manoharan <rmanohar@codeaurora.org> Signed-off-by: Tamizh chelvam <tamizhr@codeaurora.org>
This commit is contained in:
parent
ec2b5173ce
commit
d58c3bd8b7
@ -642,7 +642,7 @@ void hostapd_event_sta_low_ack(struct hostapd_data *hapd, const u8 *addr)
|
|||||||
{
|
{
|
||||||
struct sta_info *sta = ap_get_sta(hapd, addr);
|
struct sta_info *sta = ap_get_sta(hapd, addr);
|
||||||
|
|
||||||
if (!sta || !hapd->conf->disassoc_low_ack)
|
if (!sta || !hapd->conf->disassoc_low_ack || sta->agreed_to_steer)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
hostapd_logger(hapd, addr, HOSTAPD_MODULE_IEEE80211,
|
hostapd_logger(hapd, addr, HOSTAPD_MODULE_IEEE80211,
|
||||||
|
@ -361,6 +361,10 @@ void ap_free_sta(struct hostapd_data *hapd, struct sta_info *sta)
|
|||||||
|
|
||||||
os_free(sta->ext_capability);
|
os_free(sta->ext_capability);
|
||||||
|
|
||||||
|
#ifdef CONFIG_WNM_AP
|
||||||
|
eloop_cancel_timeout(ap_sta_reset_steer_flag_timer, hapd, sta);
|
||||||
|
#endif /* CONFIG_WNM_AP */
|
||||||
|
|
||||||
os_free(sta);
|
os_free(sta);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -115,6 +115,7 @@ struct sta_info {
|
|||||||
unsigned int added_unassoc:1;
|
unsigned int added_unassoc:1;
|
||||||
unsigned int pending_wds_enable:1;
|
unsigned int pending_wds_enable:1;
|
||||||
unsigned int power_capab:1;
|
unsigned int power_capab:1;
|
||||||
|
unsigned int agreed_to_steer:1;
|
||||||
|
|
||||||
u16 auth_alg;
|
u16 auth_alg;
|
||||||
|
|
||||||
|
@ -341,6 +341,19 @@ static void ieee802_11_rx_bss_trans_mgmt_query(struct hostapd_data *hapd,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ap_sta_reset_steer_flag_timer(void *eloop_ctx, void *timeout_ctx)
|
||||||
|
{
|
||||||
|
struct hostapd_data *hapd = eloop_ctx;
|
||||||
|
struct sta_info *sta = timeout_ctx;
|
||||||
|
|
||||||
|
if (sta->agreed_to_steer) {
|
||||||
|
wpa_printf(MSG_DEBUG, "%s: Reset steering flag for STA " MACSTR,
|
||||||
|
hapd->conf->iface, MAC2STR(sta->addr));
|
||||||
|
sta->agreed_to_steer = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void ieee802_11_rx_bss_trans_mgmt_resp(struct hostapd_data *hapd,
|
static void ieee802_11_rx_bss_trans_mgmt_resp(struct hostapd_data *hapd,
|
||||||
const u8 *addr, const u8 *frm,
|
const u8 *addr, const u8 *frm,
|
||||||
size_t len)
|
size_t len)
|
||||||
@ -348,6 +361,7 @@ static void ieee802_11_rx_bss_trans_mgmt_resp(struct hostapd_data *hapd,
|
|||||||
u8 dialog_token, status_code, bss_termination_delay;
|
u8 dialog_token, status_code, bss_termination_delay;
|
||||||
const u8 *pos, *end;
|
const u8 *pos, *end;
|
||||||
int enabled = hapd->conf->bss_transition;
|
int enabled = hapd->conf->bss_transition;
|
||||||
|
struct sta_info *sta;
|
||||||
|
|
||||||
#ifdef CONFIG_MBO
|
#ifdef CONFIG_MBO
|
||||||
if (hapd->conf->mbo_enabled)
|
if (hapd->conf->mbo_enabled)
|
||||||
@ -379,11 +393,23 @@ static void ieee802_11_rx_bss_trans_mgmt_resp(struct hostapd_data *hapd,
|
|||||||
"bss_termination_delay=%u", MAC2STR(addr), dialog_token,
|
"bss_termination_delay=%u", MAC2STR(addr), dialog_token,
|
||||||
status_code, bss_termination_delay);
|
status_code, bss_termination_delay);
|
||||||
|
|
||||||
|
sta = ap_get_sta(hapd, addr);
|
||||||
|
if (!sta) {
|
||||||
|
wpa_printf(MSG_DEBUG, "Station " MACSTR
|
||||||
|
" not found for received BSS TM Response",
|
||||||
|
MAC2STR(addr));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (status_code == WNM_BSS_TM_ACCEPT) {
|
if (status_code == WNM_BSS_TM_ACCEPT) {
|
||||||
if (end - pos < ETH_ALEN) {
|
if (end - pos < ETH_ALEN) {
|
||||||
wpa_printf(MSG_DEBUG, "WNM: not enough room for Target BSSID field");
|
wpa_printf(MSG_DEBUG, "WNM: not enough room for Target BSSID field");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
sta->agreed_to_steer = 1;
|
||||||
|
eloop_cancel_timeout(ap_sta_reset_steer_flag_timer, hapd, sta);
|
||||||
|
eloop_register_timeout(2, 0, ap_sta_reset_steer_flag_timer,
|
||||||
|
hapd, sta);
|
||||||
wpa_printf(MSG_DEBUG, "WNM: Target BSSID: " MACSTR,
|
wpa_printf(MSG_DEBUG, "WNM: Target BSSID: " MACSTR,
|
||||||
MAC2STR(pos));
|
MAC2STR(pos));
|
||||||
wpa_msg(hapd->msg_ctx, MSG_INFO, BSS_TM_RESP MACSTR
|
wpa_msg(hapd->msg_ctx, MSG_INFO, BSS_TM_RESP MACSTR
|
||||||
@ -393,6 +419,7 @@ static void ieee802_11_rx_bss_trans_mgmt_resp(struct hostapd_data *hapd,
|
|||||||
MAC2STR(pos));
|
MAC2STR(pos));
|
||||||
pos += ETH_ALEN;
|
pos += ETH_ALEN;
|
||||||
} else {
|
} else {
|
||||||
|
sta->agreed_to_steer = 0;
|
||||||
wpa_msg(hapd->msg_ctx, MSG_INFO, BSS_TM_RESP MACSTR
|
wpa_msg(hapd->msg_ctx, MSG_INFO, BSS_TM_RESP MACSTR
|
||||||
" status_code=%u bss_termination_delay=%u",
|
" status_code=%u bss_termination_delay=%u",
|
||||||
MAC2STR(addr), status_code, bss_termination_delay);
|
MAC2STR(addr), status_code, bss_termination_delay);
|
||||||
|
@ -23,5 +23,6 @@ int wnm_send_bss_tm_req(struct hostapd_data *hapd, struct sta_info *sta,
|
|||||||
const u8 *bss_term_dur, const char *url,
|
const u8 *bss_term_dur, const char *url,
|
||||||
const u8 *nei_rep, size_t nei_rep_len,
|
const u8 *nei_rep, size_t nei_rep_len,
|
||||||
const u8 *mbo_attrs, size_t mbo_len);
|
const u8 *mbo_attrs, size_t mbo_len);
|
||||||
|
void ap_sta_reset_steer_flag_timer(void *eloop_ctx, void *timeout_ctx);
|
||||||
|
|
||||||
#endif /* WNM_AP_H */
|
#endif /* WNM_AP_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user