Commit 7ccc8bd7 authored by Felix Fietkau's avatar Felix Fietkau Committed by John W. Linville

mac80211: calculate beacon loss time accurately

Instead of using a fixed 2 second timeout, calculate beacon loss interval
from the advertised beacon interval and a frame count.  With this beacon
loss happens after N (default 7) consecutive frames are missed which
for a typical setup (100TU beacon interval) is ~700ms (or ~1/3 previous).
Signed-off-by: default avatarSam Leffler <sleffler@chromium.org>
Signed-off-by: default avatarFelix Fietkau <nbd@openwrt.org>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent c8a7972c
...@@ -349,6 +349,7 @@ struct ieee80211_if_managed { ...@@ -349,6 +349,7 @@ struct ieee80211_if_managed {
struct work_struct chswitch_work; struct work_struct chswitch_work;
struct work_struct beacon_connection_loss_work; struct work_struct beacon_connection_loss_work;
unsigned long beacon_timeout;
unsigned long probe_timeout; unsigned long probe_timeout;
int probe_send_count; int probe_send_count;
......
...@@ -31,10 +31,15 @@ ...@@ -31,10 +31,15 @@
#define IEEE80211_MAX_PROBE_TRIES 5 #define IEEE80211_MAX_PROBE_TRIES 5
/* /*
* beacon loss detection timeout * Beacon loss timeout is calculated as N frames times the
* XXX: should depend on beacon interval * advertised beacon interval. This may need to be somewhat
* higher than what hardware might detect to account for
* delays in the host processing frames. But since we also
* probe on beacon miss before declaring the connection lost
* default to what we want.
*/ */
#define IEEE80211_BEACON_LOSS_TIME (2 * HZ) #define IEEE80211_BEACON_LOSS_COUNT 7
/* /*
* Time the connection can be idle before we probe * Time the connection can be idle before we probe
* it to see if we can still talk to the AP. * it to see if we can still talk to the AP.
...@@ -121,7 +126,7 @@ void ieee80211_sta_reset_beacon_monitor(struct ieee80211_sub_if_data *sdata) ...@@ -121,7 +126,7 @@ void ieee80211_sta_reset_beacon_monitor(struct ieee80211_sub_if_data *sdata)
return; return;
mod_timer(&sdata->u.mgd.bcn_mon_timer, mod_timer(&sdata->u.mgd.bcn_mon_timer,
round_jiffies_up(jiffies + IEEE80211_BEACON_LOSS_TIME)); round_jiffies_up(jiffies + sdata->u.mgd.beacon_timeout));
} }
void ieee80211_sta_reset_conn_monitor(struct ieee80211_sub_if_data *sdata) void ieee80211_sta_reset_conn_monitor(struct ieee80211_sub_if_data *sdata)
...@@ -871,6 +876,9 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata, ...@@ -871,6 +876,9 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
bss_info_changed |= ieee80211_handle_bss_capability(sdata, bss_info_changed |= ieee80211_handle_bss_capability(sdata,
cbss->capability, bss->has_erp_value, bss->erp_value); cbss->capability, bss->has_erp_value, bss->erp_value);
sdata->u.mgd.beacon_timeout = usecs_to_jiffies(ieee80211_tu_to_usec(
IEEE80211_BEACON_LOSS_COUNT * bss_conf->beacon_int));
sdata->u.mgd.associated = cbss; sdata->u.mgd.associated = cbss;
memcpy(sdata->u.mgd.bssid, cbss->bssid, ETH_ALEN); memcpy(sdata->u.mgd.bssid, cbss->bssid, ETH_ALEN);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment