Re: [PATCH] d80211: Reset assoc and auth retry counters
From: Jiri Benc <hidden>
Date: 2006-11-29 14:09:31
On Tue, 28 Nov 2006 20:56:05 +0100, Ivo van Doorn wrote:
After a succesfull authentication and association the matching retry counter must be reset to 0. Failure to do so will result in failure to authenticate after the interface has been deauthenticated. This does not always happen after the first deauthentication, but after the interface has been several times been deauthenticated it will refuse to authenticate.
Thanks for spotting this, but your fix makes statistics about authentication/association exported via sysfs useless. The counters should be reset before a new authentication/association attempt (as is done in ieee80211_sta_new_auth). I think this is a more correct fix: Signed-off-by: Jiri Benc <redacted> --- net/d80211/ieee80211_sta.c | 18 +++++++++++++----- 1 files changed, 13 insertions(+), 5 deletions(-)
--- dscape.orig/net/d80211/ieee80211_sta.c
+++ dscape/net/d80211/ieee80211_sta.c@@ -382,6 +382,14 @@ static void ieee80211_set_associated(str ifsta->last_probe = jiffies; } +static void ieee80211_set_disassoc(struct net_device *dev, + struct ieee80211_if_sta *ifsta, int deauth) +{ + if (deauth) + ifsta->auth_tries = 0; + ifsta->assoc_tries = 0; + ieee80211_set_associated(dev, ifsta, 0); +} static void ieee80211_sta_tx(struct net_device *dev, struct sk_buff *skb, int encrypt, int probe_resp)
@@ -1023,7 +1031,7 @@ static void ieee80211_rx_mgmt_deauth(str IEEE80211_RETRY_AUTH_INTERVAL); } - ieee80211_set_associated(dev, ifsta, 0); + ieee80211_set_disassoc(dev, ifsta, 1); ifsta->authenticated = 0; }
@@ -1066,7 +1074,7 @@ static void ieee80211_rx_mgmt_disassoc(s IEEE80211_RETRY_AUTH_INTERVAL); } - ieee80211_set_associated(dev, ifsta, 0); + ieee80211_set_disassoc(dev, ifsta, 0); }
@@ -1882,7 +1890,7 @@ void ieee80211_sta_work(void *ptr) "mixed-cell disabled - disassociate\n", dev->name); ieee80211_send_disassoc(dev, ifsta, WLAN_REASON_UNSPECIFIED); - ieee80211_set_associated(dev, ifsta, 0); + ieee80211_set_disassoc(dev, ifsta, 0); } }
@@ -2858,7 +2866,7 @@ int ieee80211_sta_deauthenticate(struct return -EINVAL; ieee80211_send_deauth(dev, ifsta, reason); - ieee80211_set_associated(dev, ifsta, 0); + ieee80211_set_disassoc(dev, ifsta, 1); return 0; }
@@ -2878,6 +2886,6 @@ int ieee80211_sta_disassociate(struct ne return -1; ieee80211_send_disassoc(dev, ifsta, reason); - ieee80211_set_associated(dev, ifsta, 0); + ieee80211_set_disassoc(dev, ifsta, 1); return 0; }
--
Jiri Benc
SUSE Labs