Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=8a69aa93d54cb56017159b08512c80ede2263060
Commit:     8a69aa93d54cb56017159b08512c80ede2263060
Parent:     be8755e1804d6f60e6a96a46ac6bc46ce6dfca53
Author:     Daniel Drake <[EMAIL PROTECTED]>
AuthorDate: Fri Jul 27 15:43:23 2007 +0200
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Wed Oct 10 16:47:37 2007 -0700

    [MAC80211]: STA reassociation improvements
    
    My cheapy D-Link AP behaves strangely w.r.t reassociations.
    
    The following sequence of commands causes me to lose association and to be
    unable to regain it:
    
        ifconfig eth8 down
        ifconfig eth8 up
        iwconfig eth8 essid <x>
    
    This is because mac80211 tries to reassociate, rather than just associate.
    My AP replies with an association response (not a reassociation response...)
    denying the association with code 12: "Association denied due to reason
    outside the scope of this standard"
    
    mac80211 tries this reassociation another 4 times or so before finally 
giving
    up.
    
    I see 2 problems here:
     1. bringing the interface down and up again should be resetting interface 
state
        i.e. after the interface is brought down, it should have no memory of 
if or
             where it was previously associated
     2. after the first reassociation fails, mac80211 should fall back to
        standard association for the next attempt
    
    Signed-off-by: Daniel Drake <[EMAIL PROTECTED]>
    Signed-off-by: Jiri Benc <[EMAIL PROTECTED]>
    Signed-off-by: John W. Linville <[EMAIL PROTECTED]>
---
 net/mac80211/ieee80211.c     |   13 +++++++++++++
 net/mac80211/ieee80211_sta.c |    6 ++++--
 2 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/net/mac80211/ieee80211.c b/net/mac80211/ieee80211.c
index 566bdca..f811a26 100644
--- a/net/mac80211/ieee80211.c
+++ b/net/mac80211/ieee80211.c
@@ -375,6 +375,18 @@ static void ieee80211_start_hard_monitor(struct 
ieee80211_local *local)
        }
 }
 
+static void ieee80211_if_open(struct net_device *dev)
+{
+       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
+
+       switch (sdata->type) {
+       case IEEE80211_IF_TYPE_STA:
+       case IEEE80211_IF_TYPE_IBSS:
+               sdata->u.sta.prev_bssid_set = 0;
+               break;
+       }
+}
+
 static int ieee80211_open(struct net_device *dev)
 {
        struct ieee80211_sub_if_data *sdata, *nsdata;
@@ -408,6 +420,7 @@ static int ieee80211_open(struct net_device *dev)
                local->hw.conf.flags |= IEEE80211_CONF_RADIOTAP;
                return 0;
        }
+       ieee80211_if_open(dev);
        ieee80211_start_soft_monitor(local);
 
        conf.if_id = dev->ifindex;
diff --git a/net/mac80211/ieee80211_sta.c b/net/mac80211/ieee80211_sta.c
index 9aee1ab..8e65489 100644
--- a/net/mac80211/ieee80211_sta.c
+++ b/net/mac80211/ieee80211_sta.c
@@ -1187,8 +1187,10 @@ static void ieee80211_rx_mgmt_assoc_resp(struct 
net_device *dev,
        if (status_code != WLAN_STATUS_SUCCESS) {
                printk(KERN_DEBUG "%s: AP denied association (code=%d)\n",
                       dev->name, status_code);
-               if (status_code == WLAN_STATUS_REASSOC_NO_ASSOC)
-                       ifsta->prev_bssid_set = 0;
+               /* if this was a reassociation, ensure we try a "full"
+                * association next time. This works around some broken APs
+                * which do not correctly reject reassociation requests. */
+               ifsta->prev_bssid_set = 0;
                return;
        }
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to